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

链表有关问题,衷心求解。

2012-03-14 
链表问题,衷心求解。。。描述:建立一个链表,每个节点包括学生的学号、姓名、性别、年龄。先输入5个学生的数据,再

链表问题,衷心求解。。。
描述: 建立一个链表,每个节点包括学生的学号、姓名、性别、年龄。先输入5个学生的数据,再输入一个年龄,如果链表中有年龄等于此年龄的记录,则删除所有年龄等于此年龄的记录,否则在链表的最后增加一个新节点,学号为180姓名为"aaa",性别为"male"。
 
输入: 创建链表时输入5个职工的职工号和工资,学号为大于100且小于200的整数,姓名为长度小于20的字符串,性别为长度小于10的字符串,年龄为大于等于0且小于200的整数。
 
下面是鄙人写的代码,但一直不知错在哪?望高手解决。不甚感激。

[code=C/C++][

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node
{
  int num;
  char name[20];
  char sex[10];
  int year;
  struct node*next;
}snode;
snode*head;

void Create(snode*head);
void deorin(snode*head,snode*rear);
void insert(snode*head,snode*rear);
void delet(snode*head,snode*rear);
void print(snode*head);

int main()
{
  head=(snode*)malloc(sizeof(snode));
  head->next=NULL;
  Create(head);
  print(head);
  return 0;
}

void Create(snode*head)
{
  snode*p,*rear=head;
  int i;
  for(i=0;i<5;i++)
  {
  p=(snode*)malloc(sizeof(snode));
  scanf("%d",&p->num);
  getchar();
  scanf("%s",p->name);
  //gets(p->name);
  //gets(p->sex);
  scanf("%s",p->sex);
  scanf("%d",&p->year);
  getchar();
  rear->next=p;
  p->next=NULL;
  rear=p;
  }
  deorin(head,rear);
}

void deorin(snode*head,snode*rear)
{
  int f=0,count,old;
  snode*p=head->next;
  scanf("%d",&old);
  for(count=1;count<5;count++)
  {
  if(p->year==old)
  {
  f=1;
  p=p->next;
  }
  }
  switch(f)
  {
  case 0:insert(head,rear);break;
  case 1:delet(head,rear);break;
  }
}

void insert(snode*head,snode*rear)
{
  snode*p;
  p=(snode*)malloc(sizeof(snode));
  rear->next=p;
  p->next=NULL;
  rear=p;
  p->num=180;
  strcpy(p->name,"aaa");
  strcpy(p->sex,"male");
  p->year=28;
}

void delet(snode*head,snode*rear)
{
  snode*p1=head,*q=p1->next,*p2=q->next;
  while(q!=rear)
  {
  if(q->year!=28)
  {
  p1=q;
  q=q->next;
  p2=p2->next;
  }
  else
  {
  p1->next=q->next;
  q=p2;
  p2=p2->next;
  }
  }
  if(q->year==28)
  {
  p1->next=NULL;
  }
}

void print(snode*head)
{
  snode*p=head->next;
  while(p->next!=NULL)
  {
  printf("%d\n",p->num);
  puts(p->name);
  puts(p->sex);
  printf("%d\n",p->year);
  p=p->next;
  }
}
/code]


[解决办法]
deorin 函数里,
scanf("%d",&old); 后加上 getchar(); 获取输入的指定年龄
for(count=1 循环改为
for(count=0;count<3;count++)
{
if(p->year==old)
{
f=1;
break; 
}
p=p->next; 


}
case 1:delet(head,rear) 改为 case 1:delet(head,rear,old),将得到的指定年龄传参,当然,delete函数声明和定义都要改

delete函数里:
p2没有用,相关代码都可去掉
一个严重的问题,删除节点时,没有free。
else
{
p1->next=q->next;
free(q); 
q=p1->next;
}
还有在程序最后,也要把整个list 释放掉。

其他的调试着改吧

热点排行