首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

!关于链表的有关问题

2012-03-11 
求救!关于链表的问题按照以下代码,我按1键后,输入了几组数据,但是我按5键时,只出现第一组数据输出,不知道

求救!关于链表的问题
按照以下代码,我按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)

热点排行