• 全部
  • 问答

链式存储的线性表操作

linghupan 2008-04-06 11:03:43
在计算机上先输入一串正整数的序列.编写一个程序首先用链接表存储该序列.然后执行删除操作,即先从链表中找出最小的结点,删除它,然后在剩余的链表中找出最小的结点,再删除它,直至表空为止.
/*第一行用来写注释,不能写代码*/

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

struct number
{long num;
struct number *next;};
int n,j;

struct number *creat(void)
{struct number *head;
struct number *p1,*p2;
n=0;
p1=p2=(struct number*)malloc(LEN);
printf("Please input positive numbers\n");
scanf("%ld",&p1->num);
head=NULL;
while(p1->num!=0)
{ n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct number*)malloc(LEN);
scanf("%ld",&p1->num); }
p2->next=NULL;
j=n;
return(head);}

void print(struct number *head)
{struct number *p;
printf("\nNow ,there are %d numbers\n ", n);
p=head;
if(head!=NULL)
do {printf("%ld\t",p->num);
p=p->next;}
while(p!=NULL);}

struct number *del(struct number *head,long min)
{struct number *p1,*p2;

if(head==NULL)
printf("\nNo number\n");
p1=head;
min=p1->num;
while(p1->next!=NULL)
{p2=p1;
p1=p2->next;
if(min>=p1->num)
min=p1->num;}
if(p1==head) head=p1->next;
else p2->next=p1->next;
printf("delete:%ld\n",min);
n=n-1;
return(head);}

main()
{struct number *head;
int i;
long min;

head=creat();
print(head);

for(i=1;i<=j;i++)
{ del(head,min);
print(head);}
}

请大虾们帮看下,怎么改啊?thank you~~
...全文
61 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
linghupan 2008-04-06


if(head==NULL)
printf("\nNo number\n");
 
这两句怎么好象没什么效果啊?什么时候才有作用?
回复
tujinlong 2008-04-06
很好啊.我分享了;
回复
太乙 2008-04-06
有几点错误:
一、在创建的时候,根本没把最小节点的那个地址真正保存在p1里,其实,即使你保存了,第二次while循环又给改了,所以,我重新声明了minP和beforeMinp来保存最小节点和最小节点的前一个节点。这样,只是在min改变时才保存最小节点
二、在main里del时,如果删除的是head节点,那么,你根本没改变head的指向,一调试你就知道了,所以,调用del后,应该把del的返回值赋给head,这样就行了~~
回复
太乙 2008-04-06


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

struct number
{
long num;
struct number *next;
};
int n,j;

struct number *creat(void)
{
struct number *head;
struct number *p1,*p2;
n=0;
p1=p2=(struct number*)malloc(LEN);
printf("Please input positive numbers\n");
scanf("%ld",&p1->num);
head=NULL;
while(p1->num!=0)
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct number*)malloc(LEN);
scanf("%ld",&p1->num);
}
p2->next=NULL;
j=n;
return(head);
}

void print(struct number *head)
{
struct number *p;
printf("\nNow ,there are %d numbers\n ", n);
p=head;
if(head!=NULL)
do {
printf("%ld\t",p->num);
p=p->next;
}
while(p!=NULL);
}

struct number *del(struct number *head,long min)
{
struct number *p1,*p2;
struct number *minP,*beforeMinp;

if(head==NULL)
printf("\nNo number\n");
p1=head;
minP=head;
min=p1->num;
while(p1->next!=NULL)
{
p2=p1;
p1=p2->next;
if(min>=p1->num)
{
min=p1->num;
beforeMinp=p2;
minP=p1;
}
}
if(minP==head)
head=minP->next;
else beforeMinp->next=minP->next;
printf("delete:%ld\n",min);
n=n-1;
return(head);
}

main()
{
struct number *head;
int i;
long min;

head=creat();
print(head);

for(i=1;i <=j;i++)
{
head = del(head,min);
print(head);
}
}


回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-04-06 11:03
社区公告
暂无公告