现在,动态链表结点定义为由一个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
以上代码出现的问题是不能跳出链尾实现从链尾向后的伸长,只需修改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++;
}