顺序表:用一段地址连续的存储单元依次存储数据元素的线性结构。
分别实现顺序表在各个位置的增删查改。
seqlist.h文件
#ifndef __SEQLIST_H_ #define __SEQLIST_H_ #define SEQLIST_MAX_Length 1000 #define ELEMTYPE char typedef struct { ELEMTYPE sqlist[SEQLIST_MAX_Length]; size_t size; }seqlist; seqlist seq; void INIT_Seq(seqlist *seq); void END_PUSH_Seq(seqlist *seq,ELEMTYPE value); void END_POP_Seq(seqlist *seq); void FRONT_PUSH_Seq(seqlist *seq,ELEMTYPE value); void FRONT_POP_Seq(seqlist *seq); char GET_RANDOM_ADDRESS(seqlist *seq,size_t n); void ALTER_RANDROM_ADDRESS(seqlist *seq,size_t x,ELEMTYPE value); size_t FIND_RANDOM_NUBER(seqlist *seq,ELEMTYPE value); void INSERT_RANDOM(seqlist *seq,size_t t,ELEMTYPE value); void ERASE_POSITON_VALUE(seqlist *seq,size_t position); void REMOVE_VALUE(seqlist *seq, ELEMTYPE to_delete); void REMOVEALL_VALUR(seqlist *seq, ELEMTYPE to_delete); void REMOVEALL1_VALUR(seqlist *seq, ELEMTYPE to_delete); void REMOVEALL2_VALUR(seqlist *seq, ELEMTYPE to_delete); size_t SEQSIZE(seqlist *seq); int SEQISEmpty(seqlist* seq); void show(seqlist *seq,ELEMTYPE* massage); void swap(ELEMTYPE *x,ELEMTYPE *y); void SeqBubbleSort(seqlist* seq); int char_cmp(void *x,void *y); void SeqBubbleSort2(seqlist* seq, int (*cmp)(SType , SType)); //test void Test_END_PUSH_Seq(); void Test_END_POP_Seq(); void Test_FRONT_PUSH_Seq(); void Test_FRONT_POP_Seq(); void Test_ALTER_RANDROM_ADDRESS(); void Test_GET_RANDOM_ADDRESS(); void Test_FIND_RANDOM_NUBER(); void Test_INSERT_RANDOM(); void Test_ERASE_POSITON_VALUE(); void Test_REMOVE_VALUE(); void Test_REMOVEALL_VALUR(); void Test_SEQSIZE(); void Test_SeqBubbleSort(); #endif
seqlist.c文件
#include<stdio.h> #include<assert.h> #include"seqlist.h" void show(seqlist *seq,ELEMTYPE*massage) { size_t i = 0; assert(seq); printf("%s",massage);//__FUNCTION__ for(i=0;i< seq->size;i++) { printf("%c ",seq->sqlist[i]); } printf("\n\n"); } //初始化 void INIT_Seq(seqlist *seq) { seq->size = 0; seq->sqlist[seq->size] = 0; } //尾插 void END_PUSH_Seq(seqlist *seq,ELEMTYPE value) { assert(seq); if(seq->size>SEQLIST_MAX_Length) { printf("error\n"); return; } seq->sqlist[seq->size] = value; seq->size++; //printf("%c ",seq->sqlist[seq->size]); } //尾删 void END_POP_Seq(seqlist *seq) { size_t i = 0; assert(seq); if(seq->size <=0) { printf("顺序表为空。\n"); return; } seq->size--; } //头插 void FRONT_PUSH_Seq(seqlist *seq,ELEMTYPE value) { size_t i = 0; assert(seq); seq->size++; if(seq->size>SEQLIST_MAX_Length) { printf("error\n"); return; } for(i=seq->size;i>0;i--) { seq->sqlist[i]=seq->sqlist[i-1]; } seq->sqlist[0]=value; } //头删 void FRONT_POP_Seq(seqlist *seq) { size_t i = 0; assert(seq); if(seq->size <=0) { printf("顺序表为空。\n"); return; } seq->size--; for(i=0;i<seq->size;i++) { seq->sqlist[i]=seq->sqlist[i+1]; } } //读任意位置的元素 char GET_RANDOM_ADDRESS(seqlist *seq,size_t n) { assert(seq); if(n>=0 && n<=seq->size) { return seq->sqlist[n]; } else { printf("输入错误\n"); } return 0; } //修改任意位置的元素 void ALTER_RANDROM_ADDRESS(seqlist *seq,size_t x,ELEMTYPE value) { assert(seq); if(x>=0 && x<=seq->size) { seq->sqlist[x] = value; } else { printf("输入错误\n"); return; } } //查找指定位置的元素 size_t FIND_RANDOM_NUBER(seqlist *seq,ELEMTYPE value) { size_t i = 0; assert(seq); for(i=0;i<seq->size;i++) { if(seq->sqlist[i]==value) { return i; } } printf("没有该元素\n"); return (size_t)-1; } //在任意位置插入元素 void INSERT_RANDOM(seqlist *seq,size_t t,ELEMTYPE value) { size_t i = 0; assert(seq); seq->size++; if(seq->size>SEQLIST_MAX_Length) { printf("error\n"); } if(seq->size < t) { printf("输入错误,请重新输入。\n\n"); return; } for(i=seq->size;i>t;i--) { seq->sqlist[i]=seq->sqlist[i-1]; } seq->sqlist[t] = value; } //删除指定位置的元素 void ERASE_POSITON_VALUE(seqlist *seq,size_t position) { size_t i = 0; assert(seq); if(seq->size<0) { printf("顺序表为空,无法删除\n"); return; } if(seq->size <= position || position < 0) { printf("该位置不存在元素,请重新输入。\n\n"); return; } for(i=position;i<seq->size;i++) { seq->sqlist[i]=seq->sqlist[i+1]; } seq->size--; } //删除顺序表中指定的值, 如果存在重复元素, 只删除第一个 void REMOVE_VALUE(seqlist *seq, ELEMTYPE to_delete) { size_t i = 0; int flag = 1; assert(seq); for(i=0;i<seq->size;i++) { if(seq->sqlist[i] == to_delete) { ERASE_POSITON_VALUE(seq,i); flag = 0; return; } } if(flag == 1) { printf("该元素不存在\n"); return; } } //删除顺序表中所有的指定的值 void REMOVEALL_VALUR(seqlist *seq, ELEMTYPE to_delete) { size_t i = 0,j = 0 ; int flag = 1; assert(seq); if(seq->size<0) { printf("顺序表为空,无法删除\n"); return; } for(i=0;i<seq->size;i++) { if(seq->sqlist[i] == to_delete) { flag = 0; for(j=i;j<seq->size;j++) //判断被删除元素的下一个元素是不是也要被删除 { ERASE_POSITON_VALUE(seq,j); if(seq->sqlist [j+1] != to_delete) { ERASE_POSITON_VALUE(seq,j); break; } } } } if(flag == 1) { printf("该元素不存在\n"); return; } } void REMOVEALL1_VALUR(seqlist *seq, ELEMTYPE to_delete) { size_t i = 0,j = 0,count = 0; assert(seq); if(seq->size<0) { printf("顺序表为空,无法删除\n"); return; } for(i=0;i<seq->size;) { if(seq->sqlist [i] == to_delete) { count++; i++; continue; } else { seq->sqlist[j] = seq->sqlist [i]; i++; j++; } } seq->size = seq->size-count; } void REMOVEALL2_VALUR(seqlist *seq, ELEMTYPE to_delete) { size_t i = 0,j = 0,count = 0; assert(seq); if(seq->size <= 0) { printf("改顺序表为空。\n\n"); return; } for(;i<seq->size ;i++) { if(seq->sqlist [i] == to_delete) { count++; } else { seq->sqlist [i-count] = seq->sqlist[i]; } } seq->size -= count; } //求顺序表中元素的个数 size_t SEQSIZE(seqlist *seq) { assert(seq); if(seq->size <0) { printf("该顺序表为空\n"); return (size_t)-1; } return seq->size ; } //判定顺序表是否为空 int SEQISEmpty(seqlist* seq) { assert(seq); if(seq->size <=0) { return 1; } else return 0; } //冒泡排序 void swap(ELEMTYPE *x,ELEMTYPE *y) { ELEMTYPE temp = *x; //temp= *x; *x = *y; *y = temp; } void SeqBubbleSort(seqlist* seq) { size_t i = 0,j = 0,flag = 1; assert(seq); for(i=0;i<seq->size-1;i++) { for(j=0;j<seq->size-i-1;j++) { if(seq->sqlist [j] > seq->sqlist [j+1]) { flag = 0; swap(&seq->sqlist [j],&seq->sqlist [j+1]); } } if(flag ==1) { return ; } } } int char_cmp(void *x,void *y) { char *a = x; char *b = y; return a > b ? 1: a < b ? -1 : 0 ; } void SeqBubbleSort2(seqlist* seq, int (*cmp)(SType , SType)) { size_t i = 0,j = 0,flag = 1; assert(seq); for(i=0;i<seq->size-1;i++) { for(j = 0;j<seq->size-i-1;j++) { if(cmp ((char *)seq->sqlist [j],(char *)seq->sqlist [j+1])>0) { swap(&seq->sqlist [j],&seq->sqlist [j+1]); flag = 0; } } if(flag == 1) { return ; } } }
test.c文件
#include<stdio.h> #include<assert.h> #include"seqlist.h" void Test_END_PUSH_Seq() { printf("|||||||||||||||||||||||||||||||||||||||||尾插||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); END_PUSH_Seq(&seq,'a'); END_PUSH_Seq(&seq,'b'); END_PUSH_Seq(&seq,'c'); END_PUSH_Seq(&seq,'d'); END_PUSH_Seq(&seq,'e'); show(&seq,"尾插"); } void Test_END_POP_Seq() { printf("|||||||||||||||||||||||||||||||||||||||||尾删||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); //END_POP_Seq(&seq); //判断边界条件 END_PUSH_Seq(&seq,'a'); END_PUSH_Seq(&seq,'b'); END_PUSH_Seq(&seq,'c'); END_PUSH_Seq(&seq,'d'); END_PUSH_Seq(&seq,'e'); END_POP_Seq(&seq); show(&seq,"尾删"); } void Test_FRONT_PUSH_Seq() { printf("|||||||||||||||||||||||||||||||||||||||||头插||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); FRONT_PUSH_Seq(&seq,'a'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'c'); FRONT_PUSH_Seq(&seq,'d'); FRONT_PUSH_Seq(&seq,'e'); show(&seq,"头插"); } void Test_FRONT_POP_Seq() { printf("|||||||||||||||||||||||||||||||||||||||||头删||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); //FRONT_POP_Seq(&seq); //判断边界条件 FRONT_PUSH_Seq(&seq,'a'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'c'); FRONT_PUSH_Seq(&seq,'d'); show(&seq,"头插"); FRONT_POP_Seq(&seq); show(&seq,"头删"); } void Test_ALTER_RANDROM_ADDRESS() { printf("|||||||||||||||||||||||||||||||||||||||||修改||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); FRONT_PUSH_Seq(&seq,'a'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'c'); FRONT_PUSH_Seq(&seq,'d'); show(&seq,"头插"); //printf("\n请输入想要修改的位置的元素:"); ALTER_RANDROM_ADDRESS(&seq,2,'p'); show(&seq,"修改"); } void Test_GET_RANDOM_ADDRESS() { printf("|||||||||||||||||||||||||||||||||||||||||读取||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); FRONT_PUSH_Seq(&seq,'a'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'c'); FRONT_PUSH_Seq(&seq,'d'); show(&seq,"头插"); //printf("请输入想要读取的位置:"); printf("%c\n", GET_RANDOM_ADDRESS(&seq,1)); } void Test_FIND_RANDOM_NUBER() { printf("|||||||||||||||||||||||||||||||||||||||||下标||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); FRONT_PUSH_Seq(&seq,'a'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'c'); FRONT_PUSH_Seq(&seq,'d'); show(&seq,"头插"); //printf("要查找的元素的下标为:"); printf("%d", FIND_RANDOM_NUBER(&seq,'d')); printf("\n"); //若返回为-1,则就是没有改元素 } void Test_INSERT_RANDOM() { printf("|||||||||||||||||||||||||||||||||||||||||插入||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); FRONT_PUSH_Seq(&seq,'a'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'c'); FRONT_PUSH_Seq(&seq,'d'); show(&seq,"头插"); //printf("\n要插入的元素为:"); INSERT_RANDOM(&seq,2,'k'); show(&seq,"插入"); } void Test_ERASE_POSITON_VALUE() { printf("|||||||||||||||||||||||||||||||||||位置删除||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); FRONT_PUSH_Seq(&seq,'a'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'c'); FRONT_PUSH_Seq(&seq,'d'); show(&seq,"头插"); //printf("删除指定位置的元素:"); ERASE_POSITON_VALUE(&seq,3); show(&seq,"删除"); } void Test_REMOVE_VALUE() { printf("||||||||||||||||||||||||||||||元素删除||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); //REMOVE_VALUE(&seq, 'b'); FRONT_PUSH_Seq(&seq,'a'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'c'); FRONT_PUSH_Seq(&seq,'d'); show(&seq,"头插"); //printf("删除指定元素:"); REMOVE_VALUE(&seq, 'b'); show(&seq,"元素删除"); } void Test_REMOVEALL_VALUR() { printf("||||||||||||||||||||||||||||||元素所有删除||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); FRONT_PUSH_Seq(&seq,'a'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'c'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'d'); FRONT_PUSH_Seq(&seq,'b'); show(&seq,"头插"); //printf("删除顺序表中所有的指定的值:"); //REMOVEALL_VALUR(&seq, 'b'); //方法一 //REMOVEALL1_VALUR(&seq, 'b'); //方法二 REMOVEALL2_VALUR(&seq, 'b'); //方法三 show(&seq,"元素所有删除"); } void Test_SEQSIZE() { printf("||||||||||||||||||||||||||||||元素个数||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); FRONT_PUSH_Seq(&seq,'a'); FRONT_PUSH_Seq(&seq,'b'); FRONT_PUSH_Seq(&seq,'c'); FRONT_PUSH_Seq(&seq,'b'); show(&seq,"头插"); //printf("求元素的个数:"); printf("%d\n",SEQSIZE(&seq)); } void Test_SEQISEmpty() { printf("||||||||||||||||||||||||||||||判空||||||||||||||||||||||||||||||||||||||||||\n"); printf("判顺序表是否为空:"); printf("%d\n",SEQISEmpty(&seq)); } void Test_SeqBubbleSort() { printf("||||||||||||||||||||||||||||||冒泡||||||||||||||||||||||||||||||||||||||||||\n"); INIT_Seq(&seq); FRONT_PUSH_Seq(&seq,'a'); FRONT_PUSH_Seq(&seq,'v'); FRONT_PUSH_Seq(&seq,'g'); FRONT_PUSH_Seq(&seq,'q'); FRONT_PUSH_Seq(&seq,'d'); FRONT_PUSH_Seq(&seq,'j'); FRONT_PUSH_Seq(&seq,'l'); show(&seq,"头插"); //printf("将顺序表中的元素用冒泡法进行排序:"); show(&seq,"排序前的结果为:"); //SeqBubbleSort(&seq); SeqBubbleSort2(&seq, char_cmp); show(&seq,"排序后的结果为:"); } int main() { Test_END_PUSH_Seq(); Test_END_POP_Seq(); Test_FRONT_PUSH_Seq(); Test_FRONT_POP_Seq(); Test_ALTER_RANDROM_ADDRESS(); Test_GET_RANDOM_ADDRESS(); Test_FIND_RANDOM_NUBER(); Test_INSERT_RANDOM(); Test_ERASE_POSITON_VALUE(); Test_REMOVE_VALUE(); Test_REMOVEALL_VALUR(); Test_SEQSIZE(); Test_SeqBubbleSort(); return 0; }
运行结果: