首页新闻找找看学习计划

关于“动态链表,一边创建一边按顺序插入新结点”的问题

0
悬赏园豆:160 [已关闭问题] 关闭于 2017-05-26 22:55

现在,动态链表结点定义为由一个int型和一个指针的结构体。代码条件是一边创建链表一边按顺序插入新结点,以输入-1结束链表。难点在于在此条件下,如何实现尾插入?这也是我的代码出现的问题。请有意探讨者来分析解决一下。

#include<stdio.h>

#define len sizeof(struct list*)

#define setup (struct list*)malloc(len)

struct list {

int i;

struct list *next; };

int cnt;

 

struct list* creact()

{

  int data; struct list *p,*q,*head,*tail,*t;

  p=setup; scanf("%d",&data);//初始头节点

  if(data!=-1)

  {

  p->i=data; head=tail=p; cnt=1;//计数

  }

else exit(0);

 

 

while(scanf("%d",&data)!=EOF&&data!=-1)

{

   if(cnt==1) tail->next=NULL;

  if(data<=head->i)

  { p=setup; p->i=data; p->next=head; head=p; }

 

  else

  {

     int j; p=head; for(j=1;j<cnt;j++)//确定位置

    {

       if(j!=1) p=p->next; t=p->next;//不能用(p->next)->i这种写法,应用新的变量替换

      if(p->i<data&&t->i>=data) break;

    }

    if(t!=NULL) { q=setup; q->i=data; q->next=p->next; p->next=q; }

else//为什么从第三个结点开始就只执行它?p移动不到链尾,跳不出链表

    {

      q=setup; q->i=data; p->next=q; tail=q; tail->next=NULL;

    }

  }

cnt++;

}

tail->next=NULL;

return (head);

}

 

 

void output(struct list*head)

{

struct list*p=head;

printf("HAVE %d NODE:\n",cnt);

while(p!=NULL)

   {

     printf("%d ",p->i); p=p->next;

  }

}

int main()

{

struct list *a; a=creact(); output(a); return 0;

}

 

测试数据:

input

5
4
6
1
-8
-1

 

output

HAVE 5 NODE:
-8 1 4 6 5

gnosed的主页 gnosed | 菜鸟二级 | 园豆:204
提问于:2017-05-25 21:39
< >
分享
所有回答(1)
0

以上代码出现的问题是不能跳出链尾实现从链尾向后的伸长,只需修改while循环里的尾插入代码部分,直接用if语句判断新输入的data是否大于指向链尾的tail结点的整型i,是就实现从链尾向后的增长。

修改代码如下:

 

while(scanf("%d",&data)!=EOF&&data!=-1)
{
if(data<=head->i)//链头前插入
{
p=setup;
p->i=data;
p->next=head;
head=p;
}
else if(data>tail->i)//链尾后插入
{
q=setup;
q->i=data;
tail->next=q;
tail=q;
}
else//链中插入
{
int j;
p=head;
for(j=1;j<cnt;j++)//确定插入位置
{
if(j!=1)
p=p->next;
t=p->next;//没有(p->next)->i这种写法,应用另一个变量t替换 p->next
if(p->i<data&&t->i>=data)
break;
}
q=setup;
q->i=data;
q->next=p->next;
p->next=q;
}
cnt++;
}

gnosed | 园豆:204 (菜鸟二级) | 2017-05-26 22:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册