读书人

链表有关问题衷心求解。

发布时间: 2012-03-14 12:01:12 作者: rapoo

链表问题,衷心求解。。。
描述: 建立一个链表,每个节点包括学生的学号、姓名、性别、年龄。先输入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 释放掉。

其他的调试着改吧

读书人网 >C++

热点推荐