这个函数可以实现建立一个长度为n的链表
创新互联专业提供成都主机托管四川主机托管成都服务器托管四川服务器托管,支持按月付款!我们的承诺:贵族品质、平民价格,机房位于中国电信/网通/移动机房,联通服务器托管服务有保障!
不过c=Create(a);这里c是一个表头指针,内容为空,要访问链表应该从c-next所指向的节点开始,例如在主函数中加上输出链表
void
main()
{int
i,a;
LinkList
*c,*p;
printf("请输入链表长度:");
scanf("%i",a);
c=Create(a);
p=c-next;
for(i=0;ia;i++)
{
printf("%4d",p-data);
p=p-next;
}
printf("\n");
}
头插法建表:算法:
p=(ListNode *)malloc(sizeof(ListNode));//生成新结点
p-data=ch; //将读入的数据放入新结点的数据域中
p-next=head;
head=p;
尾插法建表:算法
p=(ListNode *)malloc(sizeof(ListNode)); //生成新结点
p-data=ch; //将读入的数据放入新结点的数据域中
if (head==NULL)
head=p;//新结点插入空表
else
rear-next=p;//将新结点插到*r之后
rear=p;//尾指针指向新表尾
时间复杂度都是O(n)
你的代码看着不太习惯……而且……按说应该自己报错才对……
先说我觉得的核心:
addnode函数里,你while循环终止时,t是指向Null的,然后t直接就被指向了一个新开的空间,和你前面的链表完全没有联系……
改进:
1,加的时候应该判断一下,因为你建立头指针的时候,如果还没有元素,这个add的位置就应该是l-Next=(lnode *)malloc(sizeof(lnode)),如果已经有元素,那么需要找到末尾的那个元素(也就是t-Next==Null),然后是t-Next=(lnode *)malloc(sizeof(lnode))
也就是按你目前改的话,addnode中需要:
void addnode(linklist *l, int x){
if((*l)-count==0)
{
(*l)-next=(lnode *)malloc(sizeof(lnode));
(*l)-next-NULL;
(*l)-data=x;
(*l)-count++;
return;
}
lnode *t=l-next;
while(t-next!=NULL) t=t-next;
t-next=(lnode*)malloc(sizeof(lnode));//一定先开启空间,有了下一个节点的地址,再指过去,不能t已经到空了,让t=,那是直接把t挪走,而不是让链表连接起来了
t-next-next=NULL;
t-next-data=x;
(*l)-count++;
return;
}
其实更建议定义一个新的函数叫创建节点,应该能让程序更清晰
lnode* createNode(int data)
{
lnode* node=(lnode*)malloc(sizeof(lnode));
node-data=data;
node-next=NULL;
return node;
}
这样的话,你的添加节点应该能更好理解,代码我不写了,逻辑为:
添加节点(链表l,数值x){
如果头指针下没有元素
{头指针下的元素指向一个新创建的元素(*l)-next=createNode(x);
头指针元素计数加1;
返回
}
声明新的节点指针t;
如果t不是最后一个元素(这里务必注意:条件应是t-next==NULL,而不是t==NULL),让t指向其下一个节点并循环;
t的下一个节点指向一个新创建的指针(t-next=createNode(x);
l的计数加一;
}
PS:
linklist在声明的时候已经定义成了headnode的指针,为什么在初始化时候要(*l)=...呢?
l=(linklist *)malloc(sizeof(headnode))应该就好了吧,目的是开一个空间,并让l指过去
#include stdio.h
#include stdlib.h
struct node
{
int a;
node *next;
};
int main()
{
int a;
node head, *p;
p = head;
scanf("%d", a);
while (a != -1)
{
p-next = (node *)malloc(sizeof(node));
p = p-next;
p-a = a;
scanf("%d", a);
}
p-next = NULL;
for (p = head.next; p != NULL; p = p-next)
printf("%d ", p-a);
printf("\n");
return 0;
}
输入以-1结束,如:1 2 3 4 5 -1
据个例子:
#include stdio.h
#define LEN sizeof(struct A)
#define NULL 0
struct A
{ int a;
struct A* next;
};
struct A* new() /*建立链表的函数,返回链表头指针*/
{ struct A *p1,*p2,*head;
head=p2=p1=(struct A*)malloc(LEN);
scanf("%d",p1-a;)
while(p2-a!=2155)/*以2155作为输入节点的结束标志*/
{p1=(struct A*)malloc(LEN);
scanf("%d",p1-a);
p2-next=p1;
p2=p1;
}
p1-next=NULL;
return head;
}