原题链接:数据结构-Big Bang
解题思路:
①:观察题目发现用要求用线性表中的顺序表
②:定义一个结构体表示"名单表",表中的每一项都是字符串,故需再定义一个"名字结构体"
包含人名 的结构体作为名单表结构体的成员变量
typedef struct People_{ char name[20]; }*People,PEOPLE; typedef struct List_{ struct People_ *person; int length; int listsize; }*List,LIST;
③:声明所需的函数
void insert_(List L,int n,char *name); int search_(List L,char *name);/*找到后返回其位置,下标*/ void delete_(List L,char *name); void show_(List L); int compare_(char *order); void creat_List(List L); /*int search_(List L,char *name)该函数返回类型为int,是因为便于后面的删除操作 因为,删除操作里面也要查找,这样定义删除函数void delete_(List L,char *name)的时候 就不用再写一遍查找的代码了*/
④:编写主函数框架
int main() { int n,c; char name[20],order[7]; LIST L; creat_List(&L); while(scanf("%s",order)!=EOF) { c=compare_(order); switch(c){ case 1:{ /*插入名字*/ /*输入位置和名字*/ scanf("%d",&n); scanf("%s",name); /*判断插入位置是否合法*/ /*n=1插入到下标为0,故可插入位置为下标从0到length 故n为1到length+1*/ if(n>=1&&n<=L.length+1) insert_(&L,n,name); break; } case 2:{ /*删除名字*/ /*输入名字*/ scanf("%s",name); delete_(&L,name); break; } case 3:{ /*输出list中所有名字*/ show_(&L); break; } case 4:{ /*查找位置*/ /*输入查找的名字*/ scanf("%s",name); int d=search_(&L,name); /*找到的话输出*/ if(d!=-1) printf("%d\n",d+1); break; } } } return 0; }
⑤:定义声明的函数
注意事项:
1)插入时判断位置是否合法
2)插入后表长度加1
3)删除后表长度减去1
4)插入前判断表是否满了,满了的话重分配空间
5)输出的时候人名用空格隔开
6)每个输出占一行
7)表为空的时候,没名字,也要空一行
8)该代码没有考虑输入人名重复的问题
参考代码:
#include<stdio.h> #include<malloc.h> #include<string.h> #define SIZE 100 /*列表初始长度*/ #define ADD 10 /*列表满了后增加的长度*/ typedef struct People_{ char name[20]; }*People,PEOPLE; typedef struct List_{ struct People_ *person; int length; int listsize; }*List,LIST; void insert_(List L,int n,char *name); int search_(List L,char *name);/*找到后返回其位置,下标*/ void delete_(List L,char *name); void show_(List L); int compare_(char *order); void creat_List(List L); int main() { int n,c; char name[20],order[7]; LIST L; creat_List(&L); while(scanf("%s",order)!=EOF) { c=compare_(order); switch(c){ case 1:{ /*插入名字*/ /*输入位置和名字*/ scanf("%d",&n); scanf("%s",name); /*判断插入位置是否合法*/ /*n=1插入到下标为0,故可插入位置为下标从0到length 故n为1到length+1*/ if(n>=1&&n<=L.length+1) insert_(&L,n,name); break; } case 2:{ /*删除名字*/ /*输入名字*/ scanf("%s",name); delete_(&L,name); break; } case 3:{ /*输出list中所有名字*/ show_(&L); break; } case 4:{ /*查找位置*/ /*输入查找的名字*/ scanf("%s",name); int d=search_(&L,name); /*找到的话输出*/ if(d!=-1) printf("%d\n",d+1); break; } } } return 0; } /*==========================================================*/ /*用于返回数字选择功能*/ int compare_(char *order) { if(!strcmp(order,"insert")) return 1; else if(!strcmp(order,"delete")) return 2; else if(!strcmp(order,"show")) return 3; else return 4; } /*==========================================================*/ /*建立空名单*/ void creat_List(List L) { L->person=(People)malloc(SIZE*sizeof(PEOPLE)); L->length=0; L->listsize=SIZE; } /*==========================================================*/ void insert_(List L,int n,char *name) { /*判断列表是否满了*/ if(L->length==L->listsize) L->person=(People)realloc(L->person,(L->listsize+ADD)*sizeof(PEOPLE)); /*腾出插入空间*/ for(int i=L->length-1;i>=n-1;i--) L->person[i+1]=L->person[i]; /*插入名字*/ strcpy((L->person[n-1].name),name); /*列表长度加1*/ L->length++; return ; } /*==========================================================*/ void delete_(List L,char *name) { /*找出名字的位置*/ /*这里返回的直接是下标*/ int n=search_(L,name); /*没找到返回*/ if(n==-1) return ; /*删除名字*/ for(int i=n;i<L->length-1;i++) strcpy(L->person[i].name,L->person[i+1].name); /*删除完毕,长度减去1*/ L->length--; return ; } /*==========================================================*/ int search_(List L,char *name) { int n=-1;/*-1表示没找到*/ for(int i=0;i<L->length;i++) { if(!strcmp(L->person[i].name,name)) {n=i;break;} } return n; } /*==========================================================*/ void show_(List L) { /*如果表空,输出换行*/ if(L->length==0) printf("\n"); else for(int i=0;i<L->length-1;i++) printf("%s ",L->person[i].name); puts(L->person[L->length-1].name); return ; }
别忘点赞哦-.-!
0.0分
5 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复