链表是一种常见的重要的数据结构,其应用很广,要灵活使用链表就需要了解链表其中一些机制。本人在初略链表知识下完成了一个用链表实现的一个同学通讯录,他可以实现增,删,改 ,查,和遍历输出,经过本人亲自调试,可以运行成功。看懂本程序可以对链表的知识和应用有初步提升。希望能帮到大家。如果有什么不理解的地方可以留言,我会经
常回来看,力所能及说出本人写的思想和具体步骤的作用。当然觉得不足之处也欢迎提出,这样也可以方便我也可以提升自身水平。谢谢浏览!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NULL 0
#define LEN sizeof(struct student)
typedef struct student
{
long num;
char name[30];
char addr[30];
char tel[30];
struct student * next;
}
STU; //创建一个结构体类型,链表元素模板,并用STU代表本结构体类型。
STU *create() //创建链表。
{
printf("若您输入完毕请在下一次输入将学号输为0即可。\n") ;
STU *p1,*p2,*head;
int n=0;
p1=p2=(STU*)malloc(LEN); //创建链表第一个元素。
printf("请输入该同学的学号:\n");
scanf("%d",&p1->num);
printf("请输入该同学的姓名:\n");
scanf("%s",p1->name);
printf("请输入该同学的住址:\n");
scanf("%s",p1->addr);
printf("请输入该同学的电话:\n");
scanf("%s",p1->tel);
while(p1->num!=0)
{
n++;
if(n==1)
head=p1;
p1=(STU*)malloc(LEN); //创建下一个是否要接入链表的元素。
printf("请输入该同学的学号:\n");
scanf("%d",&p1->num);
printf("请输入该同学的姓名:\n");
scanf("%s",p1->name);
printf("请输入该同学的住址:\n");
scanf("%s",p1->addr);
printf("请输入该同学的电话:\n");
scanf("%s",p1->tel);
p2->next=p1;
{
printf("若您输入完毕请在下一次输入将学号输为0即可。\n") ;
STU *p1,*p2,*head;
int n=0;
p1=p2=(STU*)malloc(LEN); //创建链表第一个元素。
printf("请输入该同学的学号:\n");
scanf("%d",&p1->num);
printf("请输入该同学的姓名:\n");
scanf("%s",p1->name);
printf("请输入该同学的住址:\n");
scanf("%s",p1->addr);
printf("请输入该同学的电话:\n");
scanf("%s",p1->tel);
while(p1->num!=0)
{
n++;
if(n==1)
head=p1;
p1=(STU*)malloc(LEN); //创建下一个是否要接入链表的元素。
printf("请输入该同学的学号:\n");
scanf("%d",&p1->num);
printf("请输入该同学的姓名:\n");
scanf("%s",p1->name);
printf("请输入该同学的住址:\n");
scanf("%s",p1->addr);
printf("请输入该同学的电话:\n");
scanf("%s",p1->tel);
p2->next=p1;
p2=p1;
}
p2->next=NULL;
return head;
}
return head;
}
STU *add(STU *head,long index) // 增添新成员。
{
STU *p1,*p2,*p3;
p3=(STU *)malloc(LEN);
printf("请输入要插入的同学的学号:\n");
scanf("%d",&p3->num);
printf("请输入要插入的同学的姓名:\n");
scanf("%s",p3->name);
printf("请输入要插入的同学的住址:\n");
scanf("%s",p3->addr);
printf("请输入要插入的同学的电话:\n");
scanf("%s",p3->tel);
if(head==NULL)
{
printf("这是一个空链表!");
}
else
{
p1=p2=head;
while(p1->next!=NULL && p1->num!=index)
{
p2=p1;
p1=p1->next;
}
if(p1->num==index)
{
if(p1==head) //插头。
{
head=p3;
p3->next=p1;
}
else // 插中间
{
p2->next=p3;
p3->next=p1;
}
}
else //插尾。
{
p1->next=p3;
p3->next=NULL;
}
}
return head;
}
return head;
}
STU *del(STU *head,char name[30]) // 删除某位成员。
{
STU *p1,*p2;
if(head == NULL.)
{
printf("这是一个空链表!\n");
}
else
{
p1=head;
while(p1->next != NULL && strcmp(p1->name,name)!=0)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->name,name)==0)
{
if(p1 == head)
{
head=p1->next;
}
else
{
p2->next=p1->next;
}
}
else
{
printf("没有您要删除的同学!\n");
}
}
return head;
}
else
{
p1=head;
while(p1->next != NULL && strcmp(p1->name,name)!=0)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->name,name)==0)
{
if(p1 == head)
{
head=p1->next;
}
else
{
p2->next=p1->next;
}
}
else
{
printf("没有您要删除的同学!\n");
}
}
return head;
}
STU *upd(STU *head,char name[30]) // 修改某位成员的信息。
{
STU *p;
if(head==NULL)
{
printf("这是一个空链表!\n");
}
else
{
printf("%s\n",name);
p=head;
while(p->next!=NULL && strcmp(p->name,name)!=0)
{
p=p->next;
}
if(strcmp(p->name,name)==0)
{
printf("请输入该同学更改后的学号:\n");
scanf("%d",&p->num);
printf("请输入该同学更改后的姓名:\n");
scanf("%s",p->name);
printf("请输入该同学更改后的住址:\n");
scanf("%s",p->addr);
printf("请输入该同学更改后的电话:\n");
scanf("%s",p->tel);
}
else
{
printf("没有您想要更改的同学信息\n");
}
}
return head;
else
{
printf("%s\n",name);
p=head;
while(p->next!=NULL && strcmp(p->name,name)!=0)
{
p=p->next;
}
if(strcmp(p->name,name)==0)
{
printf("请输入该同学更改后的学号:\n");
scanf("%d",&p->num);
printf("请输入该同学更改后的姓名:\n");
scanf("%s",p->name);
printf("请输入该同学更改后的住址:\n");
scanf("%s",p->addr);
printf("请输入该同学更改后的电话:\n");
scanf("%s",p->tel);
}
else
{
printf("没有您想要更改的同学信息\n");
}
}
return head;
}
STU *look(STU *head,char name[30]) // 查看某位成员信息。
{
STU *p;
if(head==NULL)
{
printf("这是一个空链表!\n");
}
else
{
p=head;
while(p->next!=NULL && strcmp(p->name,name)!=0)
{
p=p->next;
}
if(strcmp(p->name,name)==0)
{
printf("%d\t,%s\t,%s\t,%s\n",p->num,p->name,p->addr,p->tel);
}
else
{
printf("没有您想要查看的同学信息\n");
}
}
}
else
{
p=head;
while(p->next!=NULL && strcmp(p->name,name)!=0)
{
p=p->next;
}
if(strcmp(p->name,name)==0)
{
printf("%d\t,%s\t,%s\t,%s\n",p->num,p->name,p->addr,p->tel);
}
else
{
printf("没有您想要查看的同学信息\n");
}
}
}
void print(STU *head) //遍历所有成员信息。
{
STU *p;
p=head;
if(head!=NULL)
do
{
printf("%d\t,%s\t,%s\t,%s\n",p->num,p->name,p->addr,p->tel);
p=p->next;
}
while(p!=NULL);
}
int main()
{
int a;
long index;
{
int a;
long index;
printf("************ 欢迎来到........通讯录! ************************** \n ");
printf("请您初始化您的链表:\n");
STU *head;
head=create();
while(1)
{
char name[30];
printf("请您输入您想要的操作: 1:增加节点; 2:删除节点; 3更新节点; 4:查找节点 ; 5:输出链表所以内容 ;6 :退出。\n");
scanf("%d",&a);
switch(a)
{
case 1:
{
printf("您想将节点插在学号为多少的同学的前面:");
scanf("%d",&index);
head=add(head,index);
break;
}
printf("请您初始化您的链表:\n");
STU *head;
head=create();
while(1)
{
char name[30];
printf("请您输入您想要的操作: 1:增加节点; 2:删除节点; 3更新节点; 4:查找节点 ; 5:输出链表所以内容 ;6 :退出。\n");
scanf("%d",&a);
switch(a)
{
case 1:
{
printf("您想将节点插在学号为多少的同学的前面:");
scanf("%d",&index);
head=add(head,index);
break;
}
case 2:
{
printf("您想删除的节点的同学的姓名为:\n");
scanf("%s",name);
head = del(head,name);
break;
}
{
printf("您想删除的节点的同学的姓名为:\n");
scanf("%s",name);
head = del(head,name);
break;
}
case 3:
{
printf("您想更改的节点的同学的姓名为:");
scanf("%s",name);
upd(head,name);
break;
}
{
printf("您想更改的节点的同学的姓名为:");
scanf("%s",name);
upd(head,name);
break;
}
case 4:
{
printf("您想查看的节点的同学姓名为:");
scanf("%s",name);
look(head,name);
break;
}
case 5:
{
print(head);
break;
}
case 6:
{
exit(-1);
break;
}
default:
{
printf("输入有误,请您重新输入!\n");
break;
}
{
printf("您想查看的节点的同学姓名为:");
scanf("%s",name);
look(head,name);
break;
}
case 5:
{
print(head);
break;
}
case 6:
{
exit(-1);
break;
}
default:
{
printf("输入有误,请您重新输入!\n");
break;
}
}
}
}
}
注意:本程序用的是单链表实现,而且函数调用我的传参是是传的head,子函数用的是STU*head接,这只是把创建的链表的首节点传过去,当插头,删头后会对链表head节点做出改变,所以在主函数我用head=函数就没问题了,如果你不想用head=函数来接,而直接返回函数,可以将&head传过去就可以了,如果需要这个版本的留言我可以发一份。