- 前言
- 代码展示
这是我数据结构课要求完成的代码,顺序表的增删改查,其中我觉得比较好的是我完成了查询中的二分查找,这是一个有意思和有难度的工作,我也是在b站上看的视频才得以学会
代码展示#include#include #include #define INIT_LISTSIZE 100 #define NAMESIZE 10 #define TELSIZE 12 #define ADD_LISTSIZE 10 typedef struct{ char name[NAMESIZE]; char tel[TELSIZE]; }ElemType; typedef struct{ ElemType* elem; int length; int listsize; }SqList; void initList(SqList* list); void insertList(SqList* list, ElemType* elem); void deletElem(SqList* list, char name[]); void printList(SqList* list); void addListSize(SqList* list); int findElem(SqList* list, char* name); //初始化顺序表 void initList(SqList* list){ list->elem = (ElemType*)malloc(sizeof(ElemType)*INIT_LISTSIZE); list->length = 0; list->listsize = INIT_LISTSIZE; } //插入元素 void insertList(SqList* list, ElemType* elem){ if(list->length == list->listsize){ addListSize(list); } ElemType* temp = (ElemType*)malloc(sizeof(ElemType)); list->elem[list->length] = *elem; for(int i = list->length; i > 0; i--){ if(strcmp(list->elem[i].name, list->elem[i - 1].name) < 0){ *temp = list->elem[i - 1]; list->elem[i - 1] = list->elem[i]; list->elem[i] = *temp; } else{ break; } } free(temp); list->length++; printf("插入成功n"); return; } //删除元素 void deletElem(SqList* list, char name[]){ int index = findElem(list, name); if(index == -1){ return; } for(int i = index; i < list->length - 1;i++){ list->elem[i] = list->elem[i + 1]; } printf("删除成功"); list->length--; } //打印表 void printList(SqList* list){ if(list->length == 0){ printf("这是一个空表n"); return; } for(int i = 0; i < list->length; i++){ printf("%s %sn", list->elem[i].name, list->elem[i].tel); } } //扩容 void addListSize(SqList* list){ list->elem = (ElemType*)realloc(list->elem, sizeof(ElemType)*(INIT_LISTSIZE + ADD_LISTSIZE)); list->listsize+=ADD_LISTSIZE; } //查找 int findElem(SqList* list, char* name){ int left = -1, right = list->length, mid; while(left+1 != right){ mid = (left + right) / 2; if(strcmp(name, list->elem[mid].name) == 0){ return mid; } else if(strcmp(name, list->elem[mid].name) < 0){ right--; } else{ left++; } } if(strcmp(name, list->elem[left].name) == 0){ return right; } printf("未找到对应元素n"); return -1; } int main(){ SqList list; initList(&list); int n = 1, index; char name[NAMESIZE]; ElemType tempelem; printf("1.插入元素n2.删除元素n3.打印列表n4.查找元素n0.退出n"); while(n != 0){ printf("请输入你的指令:"); scanf("%d", &n); fflush(stdin); switch(n){ case 1: printf("请输入名字和电话:"); scanf("%s %s", &tempelem.name, &tempelem.tel); fflush(stdin); insertList(&list, &tempelem); break; case 2: printf("请输入你的名字:"); scanf("%s",&tempelem.name); fflush(stdin); deletElem(&list, tempelem.name); break; case 3: printList(&list); break; case 4: printf("请输入你要查找的元素:"); scanf("%s", name); fflush(stdin); index = findElem(&list, name); if(index != -1){ printf("%s %sn", list.elem[index].name, list.elem[index].tel); } break; default: printf("无效指令n"); } } return 0; }
缺少注释,这也只是我的一次记录,说不定我会变的更好呢。



