基于C语言链表的简易同学录

基于C语言链表的简易同学录

上机作业,数据结构只用了一个链表结构,整体谈不上用了什么算法,主要想做的交互性更好一点,倒是用了些心思。

整体思路大概如下:首先想清楚这个同学录大概要实现几个功能,我这大概就是插入、删除、修改、查看、统计、打印输出、结束操作七个操作,然后把它们标好号封装在一个函数里随时被打印做提示用。之后在实现这几个功能函数前,要先把首要的创建函数写好就是构建链表的函数。然后就是各个功能函数的实现,基本就是接受链表首地址然后内部详细操作,分别完了之后写一个总的调度函数,不写函数写在主函数里也行,基本就是接受用户的输入信息,然后调用不同功能的函数实现有关操作就行。

代码如下:
#include<stdio.h>
#include<stdlib.h> 
typedef struct stu                    //定义链表结点 
{
	char a[20];                       //姓名 
	long long num;                    //电话 
	struct stu*next;
}stu,*stuadd;
int out(stuadd head);                  //声明统计函数 
void prompt()                          //输出提示页面 
{
	printf("\n");
	printf("请选择接下来的操作:\n");
	printf("******************\n");
	printf("(0) 结束操作\n");
	printf("(1) 插入信息\n");
	printf("(2) 删除信息\n");
	printf("(3) 修改信息\n");
	printf("(4) 查看信息\n"); 
	printf("(5) 统计总量\n");
	printf("(6) 输出链表\n");
	printf("******************\n");
	printf("请输入一个0~6的数字:");
}
void creat(stuadd head)                //尾插法创建链表 
{
	stuadd p1,p2;
	p2 = head;
	p1=(stuadd)malloc(sizeof(stu));
	scanf("%s%lld",p1->a,&p1->num);
	while(p1->num!=0)
    {
    	p2->next=p1;
    	p2=p1;
    	p1=(stuadd)malloc(sizeof(stu));
	    scanf("%s%lld",p1->a,&p1->num);
	}
	p2->next=NULL;
}
void add(stuadd head)                  //插入信息函数 
{
	int e,i=1,j;
	stuadd p=head,q;
	q=(stuadd)malloc(sizeof(stu));
	j=out(p)+1;                        //检测当前总量加一 
	printf("请输入要插入到的位置(不得超过当前最大位置的下一位):");
	scanf("%d",&e);
	while(e>j||e<1)                    //判断用户输入是否合理 
	{
		printf("\n——————输入有误!!!——————\n");
		printf("\n请重新输入要插入到的位置(不得超过当前最大位置的下一位):");
		scanf("%d",&e);
	}
	while(i!=e)                        //查找插入位置 
	{
		p=p->next;
		i++; 
	} 
	printf("请输入要插入的信息(姓名及联系方式空格间隔):");
	scanf("%s%lld",q->a,&q->num);
	q->next=p->next;
	p->next=q;
}
void del(stuadd head)                   //删除信息函数 
{
	int e,i=1,j;
	stuadd p=head,q;
	j=out(p);                           //检测当前总量 
	printf("请输入要删除的位置(不得超过当前最大位置):");
	scanf("%d",&e);
	while(e>j||e<1)                     //判断用户输入是否合理
	{
		printf("\n——————输入有误!!!——————\n");
		printf("\n请重新输入要删除的位置(不得超过当前最大位置):");
		scanf("%d",&e);
	}
	while(i!=e)                         //查找删除位置 
	{
		p=p->next;
		i++; 
	} 
	q=p->next;
	p->next=p->next->next;
	free(q);                            //释放删除结点空间 
}
void revise(stuadd head)                //修改信息函数 
{
	int e,i=1,j;
	stuadd p=head,q,t;
	q=(stuadd)malloc(sizeof(stu));
	j=out(p);                           //检测当前总量 
	printf("请输入要修改的位置(不得超过当前最大位置):");
	scanf("%d",&e);
	while(e>j||e<1)                      //判断用户输入是否合理
	{
		printf("\n——————输入有误!!!——————\n");
		printf("\n请重新输入要修改的位置(不得超过当前最大位置):");
		scanf("%d",&e);
	}
	while(i!=e)                          //查找修改位置 
	{
		p=p->next;
		i++; 
	} 
	printf("请输入修改后的信息(姓名及联系方式空格间隔):");
	scanf("%s%lld",q->a,&q->num);        //创建新结点替换修改位置并将其释放 
	t=p->next;
	q->next=p->next->next;
	p->next=q;
	free(t);
}
void read(stuadd head)                    //查看信息函数 
{
	int e,i=0,j=0;
	stuadd p=head;
	j=out(p);                             //检测当前总量 
	printf("请输入要查看的信息位置(不得超过当前最大位置):");
	scanf("%d",&e);
	while(e>j||e<1)                       //判断用户输入是否合理
	{
		printf("\n——————输入有误!!!——————\n");
		printf("\n请重新输入要查看的信息位置(不得超过当前最大位置):");
		scanf("%d",&e);
	}
	while(i!=e)                           //查找查看位置  并输出结点信息 
	{
		p=p->next;
		i++; 
	} 
	printf("\n第%d个位置的信息为:   name:%s    telephone:%lld\n",i,p->a,p->num);
}
int out(stuadd head)                      //检测总量函数并将其返回 
{
	int i=0;
	stuadd p=head;
	while(p->next!=NULL)                  //头结点不计入依次检测 
	{
		p=p->next;
		i++;                              //用i记录 
	} 
	return i;                             //返回i 
}
void output(stuadd head)                   //输出链表函数 
{
	int i=1;
	stuadd p=head;
	p=p->next;
	printf("\n当前链表:\n");
	printf("*****************************************\n");
	printf("%-10s %-16s %-15s\n","num","name","telephone");
	printf("\n");
	while(p!=NULL)
	{
		
		printf("%-10d %-16s %-15lld\n",i++,p->a,p->num);
		p=p->next;
	}
	printf("*****************************************\n");
}
void test(stuadd head)                     //总调度函数接收用户信息调用相关函数   
{
	int e,i; 
	prompt();
	scanf("%d",&e);
	while(e!=0)                            //当用户按0时结束操作 
	{
		if(e==1)                           //用户按1调用插入函数输出相关信息 
		{
			add(head);
			printf("\n——————插入信息成功!——————\n"); 
			output(head);                   //打印当前同学录 
			prompt();                       //输出提示页面 
			scanf("%d",&e);
		}
		else if(e==2)                       //用户按2调用删除函数输出相关信息 
		{
			del(head);
			printf("\n——————删除信息成功!——————\n"); 
			output(head);                   //打印当前同学录 
			prompt();                       //输出提示页面 
			scanf("%d",&e);
		}
		else if(e==3)                       //用户按3调用修改函数输出相关信息 
		{
			revise(head);
			printf("\n——————修改信息成功!——————\n");
			output(head);                   //打印当前同学录 
			prompt();                       //输出提示页面 
			scanf("%d",&e);
		}
		else if(e==4)                       //用户按4调用查看函数输出相关信息 
		{
			read(head);
			prompt();                       //输出提示页面 
			scanf("%d",&e);
		}
		else if(e==5)                        //用户按5输出当前总量 
		{
			i=out(head);
			printf("\n当前信息总量为:%d\n",i);
			prompt();
			scanf("%d",&e);
		}
		else if(e==6)                        //用户按6打印当前同学录 
		{
			output(head);
			prompt();                        //输出提示页面 
			scanf("%d",&e);
		}
		else                                 //用户输入不合理输出提示信息 
		{
			printf("\n——————输入有误!!!——————\n\n请重新输入一个0~6的数字:"); 
			scanf("%d",&e);
		} 
	}
}
int main()                                    //主函数 
{
	stu A;
	printf("请输入链表初始值姓名及联系方式(空格间隔,输入0 0结束):\n");
	creat(&A);                                //创建同学录链表 
	output(&A);                               //打印当前同学录 
	test(&A);                                 //进入操作函数 
	return 0;
}
运行效果:

在这里插入图片描述

同学录的内容我只留了电话和名字想写别的可以再加,整体还算比较完整,考虑了很多细节问题类似于,插入、删除位置不存在时,要报错提示啥的。其实要只做链表练习的话、也没必要考虑这些。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值