原题链接:数据结构-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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复