标题:[求助]实在想不出什么法子让它最优化
只看楼主
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
 问题点数:0 回复次数:4 
[求助]实在想不出什么法子让它最优化

刚编了个链表程序,建立一个链表,每个结点包括:学号,姓名,性别,年龄。输入一个年龄,如果链表中的结点所含的年龄等于此年龄,则将此结点删除。之中遇到个问题,不管输入的该年龄在链表的有没有,有一个或者是几个,还是全部,红色部分的for语句都要循环m(原链表的总结点数)次,实在想不出什么法子让它最优化,所以我干脆管它黑猫白猫都循环m次。大家出出点子,谢谢了!

#include<malloc.h>
#define LEN sizeof(struct student)

struct student
{
long num;
char name[20];
char sex[5];
int age;
struct student *next;
};
int m;
int flag=0;
struct student *creat(void)
{
struct student *head,*p1,*p2;
p1=p2=(struct student*)malloc(LEN);
scanf("%ld%s%s%d",&(p1->num),p1->name,p1->sex,&(p1->age));
head=NULL;
m=0;
while(p1->num!=NULL)
{m=m+1;
if(head==NULL)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student*)malloc(LEN);
scanf("%ld%s%s%d",&(p1->num),p1->name,p1->sex,&(p1->age));
}
p2->next=NULL;
return head;
}
struct student *deleteage(struct student *head,int n)
{
struct student *p1,*p2;
p1=head;
while(n!=p1->age&&p1!=NULL)
{
p2=p1;
p1=p1->next;
}
if(n==p1->age)
{
if(p1==head)head=p1->next;
else
p2->next=p1->next;
flag=flag+1;
}
return(head);
}
main()
{
struct student *head,*p;
int i,AGE;
printf("\ndata [num name sex age]:\n");
head=creat();
printf("\nInput age delete: age=");
scanf("%d",&AGE);
for(i=0;i<m;i++)
head=deleteage(head,AGE);
if(flag==0)printf("\nage %d not been found!",AGE);
else
{
p=head;
printf("\noutput data after deleted:\nnum name sex age\n");
while(p!=NULL)
{
printf("%ld%8s%6s%6d\n",p->num,p->name,p->sex,p->age);
p=p->next;
}
}
getch();
}

搜索更多相关主题的帖子: 链表 法子 白猫 最优化 结点 
2006-11-03 23:03
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
得分:0 
struct student * deleteage ( struct student * head , int n )
{
struct student *p1 , *p2 ;
p1 = head ;
while ( p1 )
{
while ( p1 && n != p1 -> age )
{
p2 = p1 ;
p1 = p1 -> next ;
}
if ( n == p1 -> age )
{
if ( p1 == head )
{
head = p1 -> next ;
free ( p1 ) ;
p1 = head ;
}
else
{
p2 -> next = p1 -> next ;
free ( p1 ) ;
p1 = p2 -> next ;
}
flag = flag + 1 ;
}
}
return ( head ) ;
}
这样就行,每次找到要删除的年龄后,删除后仍继续向下查找。
另外:你的链表在建立的时候仍有一个小BUG,你自己找找。

对不礼貌的女生收钱......
2006-11-04 16:38
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
得分:0 
谢谢,不过链表建立有什么bug呢?我找不出来

新王登基,血流成河!
2006-11-04 17:54
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
应该是这个吧.
p1=p2=(struct student*)malloc(LEN);
还有应该先判断输入的值是否合理再赋给指针.象你那样,假设循环一次都不做,虽然表面是是空表,但你已经申请了一个空间,却让它游离了.
再者while()中不要让NULL来代替0//可读性不高,一般NULL代表指针指向空.

倚天照海花无数,流水高山心自知。
2006-11-04 20:51
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
得分:0 
呵呵,我是初学者哈,都是按书上的习惯,谢谢你的建议

新王登基,血流成河!
2006-11-05 21:02



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-100638-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.314984 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved