printf(\退出 ******************\\n\ printf(\ do{
printf(\ gets(s);
c = atoi(s); /*将获取的字符串转换成整型*/
}while(c<0||c>7);
return c; /*返回输入值*/ }
2.输入信息函数 输入函数: struct address *info; /*定义当前结点*/ for(;;)
{ info=(struct address *)malloc(sizeof(struct address)); /**/
if(!info)
{
printf(\ exit(0); /*退出程序*/
} printf(\输入空姓名结束:\\n\
inputs(\请输入 姓名:\
if(!info->name[0])break; /*结束循环*/
inputs(\请输入 街道:\ inputs(\请输入 城市:\
欢迎共阅
为当前结点分配空间如果分配空间失败,如果输入姓名为空,
inputs(\请输入 国家:\ inputs(\请输入 邮编:\
insert(info,&start,&last); /*调用结点插入函数*/
}
输入函数调用到另外两个函数,inputs和insert
其中inputs中还用到fgets(str,n,fp),把键盘的输入信息传到 字符串中
char p[255]; do
{
printf(prompt); fgets(p,254,stdin);/*stdin,标准输入缓存,获取键盘输入信息*/ if(strlen(p)>count)
printf(\ }while(strlen(p)>count); p[strlen(p)-1]=0; strcpy(s,p); insert是关键函数,每当输入完一条信息都会调用到insert函数,将信息插入到链表中 if(*last==NULL) /*如果尾结点为空,意味着当前链表为空*/
{ /*则将该结点赋给头尾结点*/
i->next=NULL;
i->prior=NULL; *last=i; *start=i; return; }
欢迎共阅
else /*如果链表不为空,则将信息插入到链表尾,作为尾结点*/ {
(*last)->next=i; i->prior=*last;
i->next=NULL;
*last=(*last)->next; } *last (*last)->next NULL NULL i 插入信息会显示在链表最后i->next 3.删除·查找·显示函数 删除函数调用find函数,通过姓名,查找到该节点,然后删除该节点信息,这其中涉及到头尾节点,及其变化; 先判断是否为头结点,如果为头结点,则把原头结点的后继作为新的头结点
如果不为头结点,则该节点的前驱的next指向该节点的后继 如果该节点为尾结点,则让该节点的前驱作为新的尾结点 struct address *info; char s[80]; inputs(\请输入 姓名:\info=find(s); if(info)
{
printf(\
if(*start==info)
{
*start=info->next;
欢迎共阅
if(*start)
(*start)->prior=NULL;
else *last=NULL;
}
else
{
{
info->prior->next=info->next; if(info!=*last) info->next->prior=info->prior; else *last=info->prior; } free(info); printf(\删除成功!\\n\} 与删除相比,查找就简单的多,只需要调用find的函数,找到该节点记录并显示出来就行了,在search本身里面只要调整下输出的界面就行了
struct address *find(char *name) /*查找函数,形参为欲查找结点的name域*/
{ struct address *info; info=start; while(info)
{
if(!strcmp(name,info->name))
return info;
info=info->next;
}
欢迎共阅
相关推荐: