解题思路:
①:观察题目发现用要求用线性表中的顺序表
②:定义一个结构体表示"名单表",表中的每一项都是字符串,故需再定义一个"名字结构体"
包含人名 的结构体作为名单表结构体的成员变量
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分
7 人评分
C语言训练-计算1~N之间所有奇数之和 (C语言代码)浏览:757 |
矩阵转置 (C语言代码)浏览:1565 |
C语言训练-求素数问题 (C语言代码)浏览:1509 |
九宫重排 (C++代码)浏览:1410 |
买不到的数目 (C++代码)浏览:909 |
拆分位数 (C语言代码)浏览:1361 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:693 |
用筛法求之N内的素数。 (C语言代码)浏览:685 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:570 |
永远的丰碑 (C语言代码)浏览:608 |