读书人

!关于链表的有关问题

发布时间: 2012-03-11 18:15:38 作者: rapoo

求救!关于链表的问题
按照以下代码,我按1键后,输入了几组数据,但是我按5键时,只出现第一组数据输出,不知道哪里出了问题!帮忙解答一下!关于其中插入,删除的代码可以不看!谢谢
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct
{char num[4];
char name[10];
char sex[4];
char phone[10];
}DateType;

typedef struct node
{DateType date;
struct node *next;
}LinkNode;

typedef LinkNode *LinkList;
LinkList head;
LinkNode *p;

int menu_select();
LinkList CreateList();
void InsertNode(LinkList head,LinkNode *p);
LinkNode *FindNode(LinkList head);
void DeletNode(LinkList head);
void PrintList(LinkList head);

void main()
{for(;;)
{
switch(menu_select())
{
case 1:
printf("------------------------------\n");
printf(" 1 通讯链表的输入\n");
printf("------------------------------\n");
head=CreateList();
break;
case 2:
printf("------------------------------\n");
printf(" 2 通讯结点的插入\n");
printf("------------------------------\n");
printf(" 输入要插入的内容\n");
p=(LinkNode *)malloc(sizeof(LinkNode));
scanf("%s%s%s%s",p->date.num,p->date.name,p->date.sex,p->date.phone);
InsertNode(head,p);
break;
case 3:
printf("------------------------------\n");
printf(" 3 通讯结点的删除\n");
printf("------------------------------\n");
DeletNode(head);
break;
case 4:
printf("------------------------------\n");
printf(" 4 通讯者结点的查询\n");
printf("------------------------------\n");
p=FindNode(head);
if(p!=NULL)
printf("%s,%s,%s,%s\n",p->date.num,p->date.name,p->date.sex,p->date.phone);
else
printf("没有找到要的结点\n");
break;
case 5:
printf("------------------------------\n");
printf(" 5 通讯录链表的输出\n");
printf("------------------------------\n");
PrintList(head);

break;
case 6:
printf("\n完成\n");
break;
}
}
}
int menu_select()
{ int sn;
printf(" 通讯录管理系统\n");
printf("=====================================\n");
printf(" 1 通讯链表的输入\n");
printf(" 2 通讯结点的插入\n");
printf(" 3 通讯结点的删除\n");
printf(" 4 通讯者结点的查询\n");
printf(" 5 通讯录链表的输出\n");
printf(" 6 退出管理系统\n");
for(;;)
{
scanf("%d",&sn);
if(sn<1&&sn>6)
printf("输入错误,请再输入\n");
else
break;
}
return sn;
}




LinkList CreateList()
{LinkList head=(LinkNode *)malloc(sizeof(LinkNode));
LinkNode *p,*rear;
rear=head;
int flag=1;
while(flag==1)
{ p=(LinkNode *)malloc(sizeof(LinkNode));
printf("编号 姓名 性别 电话\n");
scanf("%s%s%s%s",p->date.num,p->date.name,p->date.sex,p->date.phone);
rear->next=p;
rear=p;
printf("结束建表吗?(0/1)");
scanf("%d",&flag);
}
rear->next=NULL;
return head;
}



void InsertNode(LinkList head,LinkNode *p)
{
LinkNode *p1,*p2;
p1=head;
p2=p1->next;
while(p2!=NULL&&strcmp(p->date.num,p2->date.num)<0)
{


p1=p2;
p2=p2->next;
p->next=p2;
p1->next=p;
}
}



LinkNode *FindNode(LinkList head)
{
LinkNode *p=head;
char num[4],name[6];
int x;
printf("==================\n");
printf("1.按编号查询\n");
printf("2.按姓名查询\n");
printf("==================\n");
printf("输入1/2");
scanf("%d",&x);
if(x==1){
printf("请输入你要查找的编号\n");
scanf("%s",num);
while(p!=NULL&&strcmp(p->date.num,num)<0)
p=p->next;
if(p==NULL||p->date.num!=num)
p=NULL; }
else
if(x==2)
{
printf("请输入你要查找的姓名\n");
scanf("%s",name);
while(p&&strcmp(p->date.name,name)!=0)
p=p->next;
}
return p;
}


void DeletNode(LinkList head)
{
LinkNode *q,*p;
p=head;
q=FindNode(head);
if(q==NULL)
printf("无此结点\n");
else
{
if(p->next!=q)
p=p->next;
p->next=q->next;
free(q);
}
}

void PrintList(LinkList head)
{
LinkNode *p;
p=head->next;
printf("编号 姓名 性别 电话\n");
if(p!=NULL)
{
printf("%s,%s,%s,%s\n",p->date.num,p->date.name,p->date.sex,p->date.phone);
printf("-------------------------------\n");
p=p->next;
}

}

[解决办法]
函数PrintList中,是循环访问,不是if
void PrintList(LinkList head)
{
LinkNode *p;
p=head->next;
printf("编号 姓名 性别 电话\n");
while(p!=NULL)
{
printf("%s,%s,%s,%s\n",p->date.num,p->date.name,p->date.sex,p->date.phone);
printf("-------------------------------\n");
p=p->next;
}

}
[解决办法]
如上while(p!=NULL)

读书人网 >C语言

热点推荐