数据结构实验:通讯录的创建与编辑

该实验通过C语言使用顺序表和单链表存储通讯录,实现显示所有记录、查找特定学生信息、插入新记录到指定位置及删除指定位置记录等功能。解题关键在于理解数据结构和正确调用算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验内容:对以下通讯录选用顺序表或单链表进行存储,设计一个程序实现:

(1)显示通讯录中所有记录。

(2)查找并输出学生姓名为张江的学生的所有信息。

(3)在通讯录中的第三行添加一个新同学的信息(内容自定)。

(4)删除通讯录中第五行的学生信息。 

学号

姓名

手机号码

178101

杨文

13788041567

178102

张江

13478920019

178103

李华

15077402345

178104

黄丽

15867748903

178105

刘宁

18977410656

 

#include<stdio.h>
#include<malloc.h>
#include<string.h>

typedef struct
{
	int xh;
	char name[10];
	char tel[11];
}STU;

typedef STU elemtype;

typedef struct
{ 
	elemtype data[10];
	int length;
}sqlist;

void main()
{ 
	void Lnitlist(sqlist *&L);
	void cin(sqlist *&L,int a);
	void cout(sqlist *&L);
	void seek(sqlist *L);
	bool ListInsert(sqlist *&L);
	bool ListDelete(sqlist *&L);
	void endcout(sqlist *&L);
	sqlist *L;
	int a;
	printf("你需要输入几个学生的信息\n");
	scanf("%d",&a);
	Lnitlist(L);
	cin(L,a);
	cout(L);
	seek(L);
	ListInsert(L);
	ListDelete(L);
	endcout(L);
}

void Lnitlist(sqlist *&L)
{ 
	L=(sqlist *)malloc(sizeof(sqlist));
	L->length=0;
}

void cin(sqlist *&L,int a)
{
	int i;
	for(i=0;i<a;i++)
	{
		printf("请分别输入学号,名字,电话\n");
		scanf("%d%s%s",&L->data[i].xh,L->data[i].name,&L->data[i].tel);
	}
	L->length=a;
}

void cout(sqlist *&L)
{ 
	int i,s=L->length;
	for(i=0;i<s;i++)
		printf("学号为%d的同学叫%s电话为%s的\n",L->data[i].xh,L->data[i].name,L->data[i].tel);
}

void seek(sqlist *L)
{ 
	char s[10],*p;
	p=s;
	int i,j=1;
	elemtype e;
	printf("请输入姓名\n");
	while(j)
	{ 
		scanf("%s",s);
		for(i=0;i<L->length;i++)
		{
			if(strcmp(p,L->data[i].name)==0)
			{ 
				e=L->data[i];
				j--;
				printf("%s同学的学号为%d电话为%s\n",p,e.xh,e.tel);
				break;
			}
		}
		if(i==L->length)
			printf("查无此人,请重新输入\n");
	}
}

bool ListInsert(sqlist *&L)
{ 
	int i,j;
	elemtype e;
	printf("请输入新同学信息\n");
	scanf("%d%s%s",&e.xh,&e.name,&e.tel);
	printf("你要把他放在第几位?\n");
	scanf("%d",&i);
	if(i<1 || i>L->length+1)
		return false;
	i--;
	for(j=L->length;j>i;j--)
		L->data[j]=L->data[j-1];
	L->data[i]=e;
	L->length++;
	return true;
}

bool ListDelete(sqlist *&L)
{ 
	int i,j;
	printf("请输入你要删除第几个同学\n");
	scanf("%d",&i);
	if(i<1 || i>L->length)
		return false;
	i--;
	for(j=i;j<L->length-1;j++)
		L->data[j]=L->data[j+1];
	L->length--;
	return true;
}

void endcout(sqlist *&L)
{ 
	int i,s=L->length;
	for(i=0;i<s;i++)
		printf("学号为%d的同学叫%s电话为%s的\n",L->data[i].xh,L->data[i].name,L->data[i].tel);
}
你需要输入几个学生的信息
5
请分别输入学号,名字,电话
178101 杨文 13788041567
请分别输入学号,名字,电话
178102 张江 13478920019
请分别输入学号,名字,电话
178103 刘龙 15077471314
请分别输入学号,名字,电话
178104 黄丽 15834372384
请分别输入学号,名字,电话
178105 周勇 18977413478
学号为178101的同学叫杨文电话为13788041567的
学号为178102的同学叫张江电话为13478920019的
学号为178103的同学叫刘龙电话为15077471314的
学号为178104的同学叫黄丽电话为15834372384的
学号为178105的同学叫周勇电话为18977413478的
请输入姓名
张江
张江同学的学号为178102电话为13478920019
请输入新同学信息
178106 王辉 13623778223
你要把他放在第几位?
3
请输入你要删除第几个同学
5
学号为178101的同学叫杨文电话为13788041567的
学号为178102的同学叫张江电话为13478920019的
学号为178106的同学叫王辉电话为13623778223的
学号为178103的同学叫刘龙电话为15077471314的
学号为178105的同学叫周勇电话为18977413478的

附:解题分析

通讯录中每个学生的信息作为一个数据元素,其类型可定义为:

typedef struct

{   int xh;

    char xm[10];

    int tel;

}STU;

 

以顺序表作为存储结构时,顺序表的类型可定义为:

typedef STU ElemType;

typedef struct

{   ElemType data[10];

    int length;

}SqList ;

 

以单链表作为存储结构时,单链表中每个结点的类型可定义为:

typedef STU ElemType;

typedef struct  LNode

{   ElemType data;

    struct LNode *next;

} LinkNode ;

 

题目要实现的功能:

(1)显示通讯录中所有记录。

(2)查找并输出学生姓名为张江的学生的所有信息。

(3)在通讯录中的第三行添加一个新同学的信息(内容自定)

(4)删除通讯录中第五行的学生信息。

 

实现以上功能就是要编写主调函数来调用顺序表或单链表的基本运算算法。

如:先调用初始化运算完成建立一个空的顺序表或单链表,然后输入通讯录的所有信息,从而得到一个非空顺序表或单链表;还可以…….?

在已得到非空表的基础上,再通过调用输出、查找、插入和删除顺序表或单链表元素的运算算法来完成各项功能。

 

关键点:搞清楚算法调用时要提供哪些参数,这些参数要根据所属的类型在调用前先定义好。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值