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 <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>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 <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#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 <= psl->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 <= psl->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 < psl->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 < psl->Size; begin++){ if (psl->array[begin] == data){ for (pos = begin; pos < psl->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 < psl->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 < psl->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] < data){ left = mid; } else{ flag = 0; return mid + 1; } } return 0; }//判断是否为空,1 表示空, 0 表示不空int Empty(Seqlist* psl){ assert(psl); if (psl->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 < psl->Size - count; in++){ flag = 0; count++; for (in = 0; in<psl->Size - 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 < (psl->Size / 2 + 1); i++){ imax = psl->array[count]; imin = psl->array[count]; for (j = count; j < (psl->Size - count); j++){ if (psl->array[j] >= imax){ imax = psl->array[j]; max = j; } if (psl->array[j] <= imin){ imin = psl->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 < 10; i++){ //这里循环可以设置在100以内,可在头文件修改N值扩大 printf("please input :"); scanf("%d", &t); Pushback(&psl, t); } show(&psl); printf("\n进行冒泡排序\n"); bubblesort(&psl); show(&psl); printf("\n将顺序表中第k个元素赋值为temp\n"); printf("请输入第k个元素的k值和temp值:\n"); scanf("%d %d", &k, &temp); Insert(&psl, k, temp); printf("\n此时顺序表为:\n"); show(&psl); printf("\n在顺序表表尾删除元素\n"); Popback(&psl); printf("此时顺序表为:\n"); show(&psl); printf("\n请输入要删除的数下标:"); scanf("%d", &y); Erase(&psl, y); show(&psl); printf("\n请输入要删除的数(只删除1个):"); scanf("%d", &v); Remove(&psl, v); show(&psl); printf("\n请输入要删除的数(全部删除):"); scanf("%d", &h); Removeall(&psl, h); show(&psl); printf("\n请输入要查找的元素:\n"); scanf("%d", &j); o = Find(&psl, j); printf("%d为第%d位:\n", j, o); printf("\n输出长度\n"); u = Size(&psl); printf("顺序表的长度为%d\n", u); system("pause"); return 0; }
下面放出测试图:
可以看出简易实现还是可以的。
如果想要测试更多的功能,可以在main函数里调用这些函数,这里就不再一一测试,
如果有什么建议或者想法,欢迎加好友一起交流!