//顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等) //头文件 #ifndef _SEQLIST_H #define _SEQLIST_H #include<stdio.h> typedef int ElemType; #define INIT_SIZE 8 typedef struct SeqList { ElemType *base; size_t capacity; size_t size; }SeqList; int isempty(SeqList *list); int isfull(SeqList *list); void InitList(SeqList *list); void push_back(SeqList *list,ElemType x); void show_list(SeqList *list); void push_front(SeqList *list,ElemType x); void pop_back(SeqList *list); void pop_front(SeqList *list); void insert_pos(SeqList *list,ElemType x,int pos); void quit_system(SeqList *list,int *x); int find(SeqList *list,ElemType x); int length(SeqList *list); void insert_val(SeqList *list,ElemType x); void sort(SeqList *list); void delete_pos(SeqList *list,int pos); void delete_val(SeqList *list,ElemType x); void clear(SeqList *list); void destory(SeqList *list); void reverse(SeqList *list); #endif //函数文件 #include"SeqList.h" int i; int isempty(SeqList *list) //检测表是否满 { return list->size == 0; } int isfull(SeqList *list) //检测表是否空 { return list->size >= list->capacity; } void InitList(SeqList *list) //表初始化 { list->capacity = INIT_SIZE; list->base = (ElemType *)malloc(sizeof(ElemType)*list->capacity); list->size = 0; } void push_back(SeqList *list,ElemType x) //尾插 { if (isfull(list)) { printf("顺序表已满,不能插入!\n") ; return; } list->base[list->size] = x; list->size++; } void show_list(SeqList *list) //显示 { if (list->size == 0) { printf("顺序表为空。\n"); return; } for (i = 0; i<list->size; ++i) { printf("%d ",list->base[i]); } printf("\n"); } void push_front(SeqList *list,ElemType x) //头插 { if (isfull(list)) { printf("顺序表已满,不能插入!\n"); return; } for (i = list->size; i > 0; i--) { list->base[i] = list->base[i - 1]; } list->base[0] = x; (list->size)++; } void pop_front(SeqList *list) //头删 { if (isempty(list)) { printf("顺序表为空,不能删除\n"); return; } for (i = 0; i < list->size; i++) { list->base[i] = list->base[i + 1]; } (list->size)--; } void pop_back(SeqList *list) //尾删 { if (isempty(list)) { printf("顺序表为空,不能删除\n"); return; } list->size--; } void insert_pos(SeqList *list,int pos) ////按位置插 { if (pos<0 || pos>list->size) { printf("插入的位置不正确。\n "); return; } if (isempty(list)) { printf("顺序表已满,不能插入.\n"); return; } for (i = list->size; i > pos; i--) { list->base[i] = list->base[i - 1]; } list->base[pos] = x; list->size++; } void quit_system(SeqList *list,int *x) //退出 { *x = 0; } int find(SeqList *list,ElemType x) //查找 { for (i = 0; i < list->size; i++) { if (list->base[i]==x) return i; } return -1; } int length(SeqList *list) //求长度 { return list->size; } void insert_val(SeqList *list,ElemType x) //按值插入 { push_back(list,x); sort(list); } void sort(SeqList *list) //排序 { if (isempty(list)) { return; } for (int i = 1; i < list->size; i++) { for (int j = 0; j < list->size - i; j++) { int temp; if (list->base[j]>list->base[j + 1]) { temp = list->base[j]; list->base[j] = list->base[j + 1]; list->base[j + 1] = temp; } } } } void delete_pos(SeqList *list,int pos) //按位置删除 { if (isempty(list)) { printf( "顺序表为空,不能删除。\n" ); return; } if (pos < 0 || pos >= list->size) { printf("删除的位置不正确。\n"); return; } for (int i = pos; i < list->size; ++i) { list->base[i] = list->base[i + 1]; } list->size--; } void delete_val(SeqList *list,ElemType x) //按值删除 { if (isempty(list)) { printf( "顺序表为空,不能删除。\n"); return; } int pos = find(list,x); if (pos == -1) { printf("未找到该数。\n"); return; } delete_pos(list,pos); } void clear(SeqList *list) //清空 { list->size = 0; } void destory(SeqList *list) //摧毁表 { list->base = NULL; } void reverse(SeqList *list) //逆序 { for (int i = 0,j = list->size - 1; i < list->size / 2; i++,j--) { int temp = list->base[i]; list->base[i] = list->base[j]; list->base[j] = temp; } } //主函数 #include"SeqList.h" void main() { SeqList mylist; InitList(&mylist); int select = 1; ElemType Item; int pos; while (select) { printf("****************************************************\n"); printf("* [1] show_list [2] quit_system *\n"); printf("* [3] push_front [4] push_back *\n"); printf("* [5] pop_front [6] pop_back *\n"); printf("* [7] insert_pos [8] insert_val *\n"); printf("* [9] delete_pos [10] delete_val *\n"); printf("* [11] find [12] length *\n"); printf("* [13] clear [14] destory *\n"); printf("* [15] reverse(逆序) [16] sort(顺序) *\n"); printf("****************************************************\n"); printf("请选择:"); scanf_s("%d",&select); switch (select) { case 1: show_list(&mylist); break; case 2: quit_system(&mylist,&select); break; case 3: printf("请输入要插入的值(-1结束):>"); while (scanf_s("%d",&Item),Item != -1) { push_front(&mylist,Item); } break; case 4: printf("请输入要插入的值(-1结束):>"); while (scanf_s("%d",Item != -1) { push_back(&mylist,Item); } break; case 5: pop_front(&mylist); break; case 6: pop_back(&mylist); break; case 7: printf("请输入要插入的位置:"); scanf_s("%d",&pos); printf("请输入要插入的值:"); scanf_s("%d",&Item); insert_pos(&mylist,Item,pos); break; case 8: printf("请输入要插入的数:"); scanf_s("%d",&Item); insert_val(&mylist,Item); break; case 9: printf("请输入要删的位置:"); scanf_s("%d",&pos); delete_pos(&mylist,pos); break; case 10: printf("请输入要删的值:"); scanf_s("%d",&Item); delete_val(&mylist,Item); break; case 11: printf("请输入要查找的数:"); scanf_s("%d",&Item); pos=find(&mylist,Item); if (pos != -1) { printf("该数为第%d个数.\n",pos); } else printf("未找到该数。\n"); break; case 12: printf("该顺序表长度为:%d\n",length(&mylist)); break; case 13: clear(&mylist); break; case 14: destory(&mylist); break; case 15: reverse(&mylist); break; case 16: sort(&mylist); break; default: break; } } }