前言
这是我数据结构课要求完成的代码,顺序表的增删改查,其中我觉得比较好的是我完成了查询中的二分查找,这是一个有意思和有难度的工作,我也是在b站上看的视频才得以学会
代码展示
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#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 %s\n", 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 %s\n", list.elem[index].name, list.elem[index].tel);
}
break;
default:
printf("无效指令\n");
}
}
return 0;
}
缺少注释,这也只是我的一次记录,说不定我会变的更好呢。