ITPub博客

首页 > IT职业 > IT生活 > c语言实现顺序表各个功能操作函数

c语言实现顺序表各个功能操作函数

IT生活 作者:dongyp 时间:2021-09-09 09:16:26 0 删除 编辑

c语言实现顺序表的操作函数

首先,一个顺序表先要用结构体定义
typedef struct Seqlist{
   Datatype array[MAX_SIZE];
   size_t Size;
}Seqlist,*psl;
 
然后要被初始化,这里用memset来初始化

    memset(psl->array, 0, MAX_SIZE*sizeof(Datatype));
    psl->Size = 0;

这里实现一个静态表,
然后就可以扩展它的功能了。
这里用代码大概写一些,把他们接口函数写在Seqlist.h头文件中:

#ifndef SEQ_LIST#define SEQ_LIST#define _CRT_SECURE_NO_WARININGS 1#include #include #include #include typedef int Datatype;#define MAX_SIZE  100typedef struct Seqlist{
    Datatype array[MAX_SIZE];
    size_t Size;
}Seqlist,*psl;void InitSeqlist(Seqlist* seqlist);// 初始化 void Pushback(Seqlist* seqlist, Datatype data);// 尾部插入void Pushfront(Seqlist* psl, Datatype data);// 头部插入 void Popback(Seqlist* psl);// 尾部删除 void Popfront(Seqlist* psl);// 头部删除 void Insert(Seqlist* psl, size_t pos, Datatype data);// 按下标插入,pos 的范围是 [0, size] void Erase(Seqlist* psl, size_t pos);// 按下标删除,pos 的范围是 [0, size) void Remove(Seqlist* psl, Datatype data);// 按值删除,只删遇到的第一个 void Removeall(Seqlist* psl, Datatype data);// 按值删除,删除所有的 void Clear(Seqlist* psl);// 清空 void show(Seqlist* psl);//打印顺序表int Find(Seqlist* psl, Datatype data);// 按值查找,返回第一个找到的下标,如果没找到,返回 -1 int Empty(Seqlist* psl);// 判断是否为空,1 表示空, 0 表示不空void Selectsort(Seqlist* psl);//选择排序void bubblesort(Seqlist* psl);//冒泡排序int Size(Seqlist* psl);// 返回数量 void Destroy(Seqlist* psl);// 销毁

如果还有想法,可以附加在这些接口函数里面。

下面就是这些功能代码分步实现了,全部写在一个.c文件里

#define _CRT_SECURE_NO_WARININGS 1#include #include #include #include #include "SeqList.h"//初始化顺序表void InitSeqlist(Seqlist* psl){    memset(psl->array, 0, MAX_SIZE*sizeof(Datatype));
    psl->Size = 0;
}//尾插void Pushback(Seqlist* seqlist, Datatype data){
    assert(seqlist);    if (seqlist->Size > MAX_SIZE){        printf("full");        return;
    }
    seqlist->array[seqlist->Size] = data;
    seqlist->Size++;
}//头插void Pushfront(Seqlist* psl, Datatype data){    int begin = 0;
    assert(psl);    if (psl->Size == MAX_SIZE){        printf("full");        return;
    }    else{        for (begin = psl->Size; begin >= 0; begin--){
            psl->array[begin + 1] = psl->array[begin];
        }
        psl->array[0] = data;
    }
    psl->Size++;
}//尾删void Popback(Seqlist* psl){
    assert(psl);    if (psl->Size == 0){        printf("empty");        return;
    }
    psl->Size--;
}//头删void Popfront(Seqlist* psl){    int begin = 0;
    assert(psl);    if (psl->Size == 0){        printf("empty");        return;
    }    else{        for (begin = 0; begin Size - 1; begin++){
            psl->array[begin] = psl->array[begin+1];
        }
    }
    psl->Size--;
}//下标插void Insert(Seqlist* psl, size_t pos, Datatype data){    int begin = 0;
    assert(psl);    if (pos > MAX_SIZE){        printf("超范围!");        return;
    }    if (psl->Size == MAX_SIZE){        printf("full");        return;
    }    else if (pos Size){        for (begin = psl->Size; begin > pos - 1; begin--){
            psl->array[begin] = psl->array[begin - 1];
        }
        psl->array[pos - 1] = data;
    }    else{        printf("位置错误!");            return;
    }
    psl->Size++;
}//下标删void Erase(Seqlist* psl, size_t pos){    int begin = 0;
    assert(psl);    if (pos > psl->Size){        printf("超出范围!");            return;
    }    if (psl->Size == 0){        printf("empty!");        return;
    }    for (begin = pos - 1; begin Size; begin++){
        psl->array[begin] = psl->array[begin + 1];
    }
    psl->Size--;
}//按值删除,只删遇到的第一个void Remove(Seqlist* psl, Datatype data){    int begin = 0;    int pos = 0;
    assert(psl);    if (psl->Size == 0){        printf("empty!");        return;
    }    for (begin = 0; begin Size; begin++){        if (psl->array[begin] == data){            for (pos = begin; pos Size; pos++){
                psl->array[pos] = psl->array[pos + 1];
            }
            psl->Size--;            return;
        }
    }    printf("该表没有此元素!");
}// 按值删除,删除所有的 void Removeall(Seqlist* psl, Datatype data){    int begin = 0;    int count = 0;
    assert(psl);    if (psl->Size == 0){        printf("empty!");        return;
    }    for (begin = 0; begin Size; begin++){        if (psl->array[begin] == data){
            count++;
        }        else{            if (count == 0){

            }            else{
                psl->array[begin - count] = psl->array[begin];
            }
        }
    }
    psl->Size -= count;
}//清空void Clear(Seqlist* psl){
    psl->Size = 0;
}//显示void show(Seqlist* psl){    int begin = 0;
    assert(psl);    if (psl->Size == 0){        printf("empty!");        return;
    }    else{        for (begin = 0; begin Size; begin++){            printf("%d ", psl->array[begin]);
        }        printf("n");
    }
}// 按值查找,返回第一个找到的下标,如果没找到,返回 -1 int Find(Seqlist* psl, Datatype data){    int begin = 0;    int left = 0;    int right = psl->Size;    int mid = 0;    int flag = 1;
    assert(psl);    if (psl->Size == 0){        printf("empty!");        return 0;
    }    if (data > (psl->Size - 1)){        printf("没有这个元素!");        return -1;
    }    while (flag){
        mid = left + (right - left) / 2;        if (psl->array[mid] > data){
            right = mid + 1;
        }        else if (psl->array[mid] Size == 0){        return 1;
    }    else{        return 0;
    }
}//返回数量 int  Size(Seqlist* psl){    return psl->Size;
}//销毁 void Destroy(Seqlist* psl){
    assert(psl);    free(psl);    printf("Destory success!");    return;
}//bubblesort排序#if 1void bubblesort(Seqlist* psl){    int in = 0;    int out = 0;    int temp = 0;    int count = 0;    int flag = 0;    for (out = 0; out Size - count; in++){
        flag = 0;
        count++;        for (in = 0; inSize - count; in++){            if (psl->array[in]>psl->array[in + 1]){
                temp = psl->array[in];
                psl->array[in] = psl->array[in + 1];
                psl->array[in + 1] = temp;
                flag = 1;
            }            else{
                ;
            }            if (flag == 0){                return;
            }
        }
    }
}#endif#if 0//选择排序void Selectsort(Seqlist* psl){    int i = 0;    int j = 0;    int count = 0;    int max = 0;    int min = 0;    int imax = psl->array[0];    int imin = psl->array[0];    for (i = 0; i Size / 2 + 1); i++){
        imax = psl->array[count];
        imin = psl->array[count];        for (j = count; j Size - count); j++){            if (psl->array[j] >= imax){
                imax = psl->array[j];
                max = j;
            }            if (psl->array[j] array[j];
                min = j;
            }
        }
        imin = psl->array[count];
        psl->array[count] = psl->array[min];
        psl->array[min] = imin;

        imax = psl->array[psl->Size - count - 1];
        psl->array[psl->Size - count - 1] = psl->array[max];
        psl->array[max] = imax;
        count++;
    }
}#endif

然后,在main函数内部写出部分函数实现一下:

#define  _CRT_SECURE_NO_WARNINGS#include"seqlist.h"#include"Seqlist.h"int main(){
    Seqlist psl;    int y,h,v,t,i,j,k,u,o,temp;
    Datatype data;    printf("顺序表初始化n");
    InitSeqlist(&psl);    printf("please input 10nums!n");    for (i = 0; i 

下面放出测试图:
图片描述
可以看出简易实现还是可以的。

如果想要测试更多的功能,可以在main函数里调用这些函数,这里就不再一一测试,
如果有什么建议或者想法,欢迎加好友一起交流!

原文出处

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3500/viewspace-2801641/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-30

  • 博文量
    86
  • 访问量
    982