C语言简单运用链表之实验代码二

综合性实验二 采用链式存储结构完成电话薄的基本操作
1.实验目的(温馨提示:此部分全班同学一致,不要修改,直接写上去就可以)
(1)掌握结点类型的定义;
(2)掌握结构体变量的定义和使用;
(3)掌握结构体指针变量做函数的参数;
(4)掌握链表的定义和使用语法规则;
(5)掌握冒泡排序算法或者选择排序算法。
2.实验内容 (温馨提示:每个题目后要给出源代码)
利用链式存储结构来完成电话薄的创建、查询、插入、删除、显示、排序以及修改等操作,具体要求如下:
1)利用尾部插入结点法建立电话薄;
2)完成在电话薄上按关键字查找即定位;
3)完成在电话薄上插入一条记录;
4)完成在电话薄上删除一条或多条记录;
5)完成电话薄的显示操作;
6)完成电话薄的排序操作;
7)完成电话薄的修改操作;

  1. 实验结果与调试过程
    此部分根据自己的实际情况,给出实验输入数据和实验输出结果,如果碰到问题的给出调试过程。
  2. 实验小结
    此部分根据自己的实际情况对本次实验进行总结,不要谈感想。

一.单链表解决

/*假如多个相同联系人姓名或号码,查找和删除只能删一个,需要改进*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct dianhuapu//定义结构体
{
    char name[20];
    char tel[20];
    struct dianhuapu* next;
}DHP;
DHP *dianhuapuchushihua()//头指针初始化
{
    DHP *head=(DHP*)malloc(sizeof(DHP));
	if(head==NULL)
	{
		printf("申请电话簿失败!\n");
					return NULL;
	}
    head->next=NULL;
	return head;
}
DHP* lxrweicha(DHP* t,char* name,char* tel,int n)//尾插插入数据
{
	DHP *q=t,*p=(DHP*)malloc(sizeof(DHP)); 
	strcpy(p->name, name);
	strcpy(p->tel, tel); 
	if(n==0)
	{
		t->next=p;
		p->next=NULL;
		return t;
	}
	while(n--)
		q=q->next;
	q->next=p;
	p->next=NULL;
	return t;
}
int lianxirenshuliang(DHP* t)//查询联系人数量
{
    int n=1;
    DHP* p=t;
    while(n)
	{
        if(p->next==NULL)break;
        p=p->next;
		n++;
    }
	return n-1;
}
int lianxirenchazhao(DHP* t,char* name,int r)//按姓名查找
{
	int n=1;
	DHP* h=t->next;
		while(r--)
		{
			if(!strcmp(h->name,name))break;
			h=h->next;
			n++;
		}
		return n;
}
int haomachazhao(DHP* t,char* name,int r)//按号码查找
{
	int n=1;
	DHP* h=t->next;
		while(r--)
		{
			if(!strcmp(h->tel,name))
				break;
			h=h->next;
			n++;
		}
		return n;
}
void deletelxr(DHP* t,int n)//根据需要删除的编号删除联系人
{
	DHP *p,*q=t;
    while(n--)
	{
		p=q;
		q=q->next;
	}
	p->next=q->next;
	free(q);
}
void xingmingpx(DHP* t,int n)//根据联系人进行排序
{
	char x[20],h[20];
	DHP *q=t;
	int i,j;
	for(i=1;i<n;i++)
	{
		t=q->next;
		for(j=1;j<=(n-i);j++)
		{
		if(strcmp(t->name,t->next->name)>0)
		{
			strcpy(x,t->name);
			strcpy(t->name,t->next->name);
			strcpy(t->next->name,x);
			strcpy(h,t->tel);
			strcpy(t->tel,t->next->tel);
			strcpy(t->next->tel,h);
		}
		t=t->next;
		}
	}
	t=q;
}
void xianshi(DHP* t,int r)//显示电话簿所有联系人信息
{
	int n=1;
	DHP* p=t->next;
	while(r--)
	{
	printf("联系人%d\n",n++);
	printf("姓名————%s\n",p->name);
	printf("电话号码——%s\n",p->tel);
	p=p->next;
	}
}
void xianshilittle(DHP* t,int n)//按位置显示
{
	DHP *p=t->next;
	while(--n)
		p=p->next;
	printf("联系人\n");
	printf("姓名————%s\n",p->name);
	printf("电话号码——%s\n",p->tel);
}
//根据联系人更改电话号码功能
//根据电话号码更改联系人功能
int main()
{
	char name[20],tel[20];
	int u=1,r,b,w,e;
	DHP *t=dianhuapuchushihua();
	loop:printf("请输入对应编号进行操作\n");
	printf("1.添加联系人\n2.显示电话簿\n3.联系人查找\n4.电话簿排序\n5.删除联系人\n0.退出电话簿\n");
	scanf("%d",&b);
	getchar();
	printf("\n");
	if(b<0 || b>5)
	{
		printf("编号输入错误\n");
		goto loop;
	}
	switch(b)
	{
	case 1:
		while(u)
		{
		printf("请输入姓名\n");
		scanf("%s",name);
		printf("请输入号码\n");
		scanf("%s",tel);
		r=lianxirenshuliang(t);
		t=lxrweicha(t,name,tel,r);
		printf("继续存入输入1,退出输入0\n");
		scanf("%d",&u);
		getchar();//头尾指针初始化
		}
		goto loop;
	case 2:
		r=lianxirenshuliang(t);
		if(r==0)
		{
			printf("电话簿中暂无数据,请存储后再试\n\n");
			goto loop;
		}
		else
		{
			printf("电话簿\n");
			xianshi(t,r);
			goto loop;
		}
	case 3:
		r=lianxirenshuliang(t);
		if(r==0)
		{
			printf("电话簿中暂无数据,请存储后再试\n\n");
			goto loop;
		}
		else
		{
			loop2:printf("请输入对应编号进行操作\n");
			printf("1.按姓名查找\n2.按号码查找\n3.按位置查找\n0.返回主界面\n");
			scanf("%d",&w);
			getchar();
			if(w==1)
			{
				printf("请输入查找的姓名\n");
				scanf("%s",name);
				e=lianxirenchazhao(t,name,r);
				if(e>r)
				{
					printf("未找到对应姓名\n");
					goto loop2;
				}
				xianshilittle(t,e);
				goto loop;
			}
			else if(w==2)
			{
				printf("请输入查找的号码\n");
				scanf("%s",tel);
				e=haomachazhao(t,tel,r);
				if(e>r)
				{
					printf("未找到对应号码\n");
					goto loop2;
				}
				xianshilittle(t,e);
				goto loop;
			}
			else if(w==3)
			{
				printf("请输入查找的位置\n");
				scanf("%d",&w);
				if(r<w || w<1)
				{
					printf("不存在该位置\n");
					goto loop2;
				}
				xianshilittle(t,w);
				goto loop;
			}
			goto loop2;
		}
	case 4:
		r=lianxirenshuliang(t);
		if(r==0)
		{
			printf("电话簿中暂无数据,请存储后再试\n\n");
			goto loop;
		}
		else
		{
		xingmingpx(t,r);
		goto loop;
		}
	case 5://联系人删除
		r=lianxirenshuliang(t);
		if(r==0)
		{
			printf("电话簿中暂无数据,请存储后再试\n\n");
			goto loop;
		}
		else
		{
			loop1:printf("请输入对应编号进行操作\n");
			printf("1.按姓名删除\n2.按号码删除\n3.按位置删除\n0.返回主界面\n");
			scanf("%d",&w);
			getchar();
			if(w==1)
			{
				printf("请输入将要删除的姓名\n");
				scanf("%s",name);
				e=lianxirenchazhao(t,name,r);
				if(e>r)
				{
					printf("未找到对应姓名\n");
					goto loop1;
				}
				deletelxr(t,e);
				printf("删除成功\n");
				goto loop;
			}
			else if(w==2)
			{
				printf("请输入将要删除的号码\n");
				scanf("%s",tel);
				e=haomachazhao(t,tel,r);
				if(e>r)
				{
					printf("未找到对应号码\n");
					goto loop1;
				}
				deletelxr(t,e);
				printf("删除成功\n");
				goto loop;
			}
			else if(w==3)
			{
				printf("请输入将要删除的位置\n");
				scanf("%d",&w);
				if(r<w || w<1)
				{
					printf("不存在该位置\n");
					goto loop1;
				}
				deletelxr(t,w);
				printf("删除成功\n");
				goto loop;
			}
			goto loop1;
		}
	case 0:
		return 0;
	}
	goto loop;
}

二.双链表解决

/*假如多个相同联系人姓名或号码,查找和删除只能删一个,需要改进*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct dianhuapu//定义结构体
{
    char name[20];
    char tel[20];
    struct dianhuapu* fron;
    struct dianhuapu* rear;
}DHP;
typedef struct dianhuapudizhi//定义结构体储存地址
{
    struct dianhuapu* first;
    struct dianhuapu* last;
}DHPD;
DHPD *dianhuapuchushihua()//头尾指针初始化
{
    DHPD *t=(DHPD*)malloc(sizeof(DHPD));
    t->first=NULL;
    t->last=NULL;
    return t;
}
DHPD* lxrweicha(DHPD* t,char* name,char* tel)//尾插插入数据
{
	DHP* p=(DHP*)malloc(sizeof(DHP));        //新建一条struct info
	strcpy(p->name, name);                               //先填充struct info的name和tel
	strcpy(p->tel, tel); 
	if(t->first==NULL && t->last==NULL)
	{          //如果这是第一条节点
		t->first=p;                              //电话本的头尾指向这第一条节点
		t->last=p;
		p->fron=NULL;                             //再填充这条单个节点的前后指针
		p->rear=NULL;
	}
	else
	{
		t->last->rear=p;                         //尾插
		p->fron=t->last;
		p->rear=NULL;
		t->last=p;
	}
	return t;
}
int lianxirenshuliang(DHPD* t)//查询联系人数量
{
    int n=0;
    DHP* p=t->first;
    if(p==NULL)
        return 0;
    while(++n)
	{
        if(p->rear==NULL)break;
        p=p->rear;
    }
	return n;
}
DHP* lianxirenchazhao(DHPD* t,char* name,int r)//按姓名查找
{
	DHP* h=t->first;
		while(r--)
		{
			if(!strcmp(h->name,name))break;
			h=h->rear;
		}
		return h;
}
DHP* haomachazhao(DHPD* t,char* name,int r)//按号码查找
{
	DHP* h=t->first;
		while(r)
		{
			if(!strcmp(h->tel,name))
				break;
			h=h->rear;
		}
		return h;
}
DHP* weizhichazhao(DHPD* t,int w)//位置查找
{
	DHP* h=t->first;
		while(--w)
		{
			h=h->rear;
		}
	return h;
}
void deletelxr(DHPD* t,DHP* p)//根据需要删除的地址删除联系人
{
    if(p->fron==NULL && p->rear==NULL)
	{
        t->first=NULL;
        t->last=NULL;
        free(p);
    }
	else if(p->fron==NULL)
	{
        t->first=p->rear;
        t->first->fron=NULL;
        free(p);
    }
	else if(p->rear==NULL)
	{
        t->last=p->fron;
        t->last->rear=NULL;
        free(p);
    }
	else
	{
        p->fron->rear=p->rear;
        p->rear->fron=p->fron;
        free(p);
    }
}
void xingmingpx(DHPD* t,int n)//根据联系人首字母进行排序
{
	char x[20],h[20];
	DHPD m=(*t);
	int i,j;
	for(i=1;i<n;i++)
	{
		(*t)=m;
		for(j=1;j<=(n-i);j++)
		{
		if(strcmp(t->first->name,t->first->rear->name)>0)
		{
			strcpy(x,t->first->name);
			strcpy(t->first->name,t->first->rear->name);
			strcpy(t->first->rear->name,x);
			strcpy(h,t->first->tel);
			strcpy(t->first->tel,t->first->rear->tel);
			strcpy(t->first->rear->tel,h);
		}
		t->first=t->first->rear;
		}
	}
	(*t)=m;
}
void xianshi(DHPD* t,int r)//显示电话簿所有联系人信息
{
	int n=1;
	DHP* p=t->first;
	while(r--)
	{
	printf("联系人%d\n",n++);
	printf("姓名————%s\n",p->name);
	printf("电话号码——%s\n",p->tel);
	p=p->rear;
	}
}
void xianshilittle(DHP* p)
{
	printf("联系人\n");
	printf("姓名————%s\n",p->name);
	printf("电话号码——%s\n",p->tel);
}
//根据联系人更改电话号码功能
//根据电话号码更改联系人功能
int main()
{
	char name[20],tel[20];
	int u=1,r,b,w;
	DHP *e;
	DHPD* t=dianhuapuchushihua();
	loop:printf("请输入对应编号进行操作\n");
	printf("1.添加联系人\n2.显示电话簿\n3.联系人查找\n4.电话簿排序\n5.删除联系人\n0.退出电话簿\n");
	scanf("%d",&b);
	getchar();
	switch(b)
	{
	case 1:
		while(u)
		{
		printf("请输入姓名\n");
		scanf("%s",name);
		printf("请输入号码\n");
		scanf("%s",tel);
		t=lxrweicha(t,name,tel);
		printf("继续存入输入1,退出输入0\n");
		scanf("%d",&u);
		getchar();//头尾指针初始化
		}
		goto loop;
	case 2:
		r=lianxirenshuliang(t);
		if(r==0)
		{
			printf("电话簿中暂无数据,请存储后再试\n\n");
			goto loop;
		}
		else
		{
			printf("电话簿\n");
			xianshi(t,r);
			goto loop;
		}
	case 3:
		r=lianxirenshuliang(t);
		if(r==0)
		{
			printf("电话簿中暂无数据,请存储后再试\n\n");
			goto loop;
		}
		else
		{
			loop2:printf("请输入对应编号进行操作\n");
			printf("1.按姓名查找\n2.按号码查找\n3.按位置查找0.返回主界面\n");
			scanf("%d",&w);
			getchar();
			if(w==1)
			{
				scanf("%s",name);
				e=lianxirenchazhao(t,name,r);
				if(e==NULL)
				{
					printf("未找到对应姓名\n");
					goto loop2;
				}
				xianshilittle(e);
				goto loop;
			}
			else if(w==2)
			{
				scanf("%s",tel);
				e=haomachazhao(t,tel,r);
				if(e==NULL)
				{
					printf("未找到对应号码\n");
					goto loop2;
				}
				xianshilittle(e);
				goto loop;
			}
			else if(w==3)
			{
				printf("请输入位置\n");
				scanf("%d",&w);
				if(r<w || w<1)
				{
					printf("不存在该位置\n");
					goto loop2;
				}
				e=weizhichazhao(t,w);
				xianshilittle(e);
				goto loop;
			}
			goto loop2;
		}
	case 4:
		r=lianxirenshuliang(t);
		if(r==0)
		{
			printf("电话簿中暂无数据,请存储后再试\n\n");
			goto loop;
		}
		else
		{
		xingmingpx(t,r);
		goto loop;
		}
	case 5://联系人删除
		r=lianxirenshuliang(t);
		if(r==0)
		{
			printf("电话簿中暂无数据,请存储后再试\n\n");
			goto loop;
		}
		else
		{
			loop1:printf("请输入对应编号进行操作\n");
			printf("1.按姓名删除\n2.按号码删除\n3.按位置删除0.返回主界面\n");
			scanf("%d",&w);
			getchar();
			if(w==1)
			{
				scanf("%s",name);
				e=lianxirenchazhao(t,name,r);
				if(e==NULL)
				{
					printf("未找到对应姓名\n");
					goto loop1;
				}
				deletelxr(t,e);
				printf("删除成功\n");
				goto loop;
			}
			else if(w==2)
			{
				scanf("%s",tel);
				e=haomachazhao(t,tel,r);
				if(e==NULL)
				{
					printf("未找到对应号码\n");
					goto loop1;
				}
				deletelxr(t,e);
				printf("删除成功\n");
				goto loop;
			}
			else if(w==3)
			{
				printf("请输入位置\n");
				scanf("%d",&w);
				if(r<w || w<1)
				{
					printf("不存在该位置\n");
					goto loop1;
				}
				e=weizhichazhao(t,w);
				deletelxr(t,e);
				printf("删除成功\n");
				goto loop;
			}
			goto loop1;
		}
	case 0:
		return 0;
	}
	goto loop;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值