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