这个链表的程序一直不明白,请大家帮忙解决!
#include <iostream.h>
typedef struct node //自定义类型Node
{
int data; //数据域
struct node *next; //指针域
}Node;
Node *createlist(int[],int);
void displist(Node *);
void freelist(Node *);
void main()
{
Node *head;
int a[]={3,6,2,7};
head=createlist(a,4);
displist(head);
freelist(head);
}
Node *createlist(int a[],int n) //建立一个链表
{
Node *head,*r,*s;
for(int i=0;i <n;i++)
{
s=(Node *) new (Node); //建立一个新结点s
//s=new Node;
s-> data =a[i];
s-> next =NULL;
if(i==0)
{
head=s; //head为首结点指针
r=s; //r总是指向最后结点
}
else
{
r-> next =s; //链接接点s
r=s;
}
}
return head;
}
为什么执行完r-> next =s;后就把下一结点的地址传给了head-> next??是如何实现的???? r,s,head三者之间是通过什么相关联的?????
请详细讲解一下,非常感谢!!!!
[解决办法]
r-> next =s;
s是下一节点的地址, r-> next = s 自然就是就把下一结点的地址传给了head-> next ( 当i == 2 )时,
i == 3 时 就把下一节点地址给了 head-> next-> next, 以此类推
r,s,head三者之间通过在结构体内定义的指针关联
[解决办法]
说了r每次记录上个节点的信息,实际上当你让r-> next等于 s的地址就相当于链表内上一个节点内next的指针值被赋予s的地址值,链表每新建一个节点,那么链表链也在不断的向前对进,前面的节点的next值都在其后一个节点创建的时候被赋值
[解决办法]
要知道r,s,head都是指针阿,在给第2个节点也就是head节点后面一个节点赋值之前指针head和指针r指向的是同一个内存换句话说这个时候做r-> next与head-> next都是同一个内存单元啊,兄弟似乎还没有弄清楚什么叫做指针阿
[解决办法]
楼主主要是将指针和对象本身混为一谈.链表建立是对象之间建立联系,也就是:
a.next -> b.next -> c.next -> null
然后不管你指针改变指向a, b, 或c, 只要不简洁修改,都和对象没啥关系. 指针之所以不停的改变,其目的就是为了:
r-> next =s; //链接接点s
只要做完这个对象数据的修改,指针就可以功成身退了.
然后只要保留指向第一个对象的指针, 就能遍历整个链表了.
[解决办法]
s=new Node; //这里创建了下一个节点
r-> next = s; //这里修改上一个节点的数据成员指向下一个节点.
[解决办法]
为什么r-next = s就相当于head-> next = s;????
请详解,谢谢!!
楼主这个还不清楚吗?
加第一个节点后,head 和r指向的是同一个节点,r = head,加入第二个时 ,r-next = s就相当于head-next = s了,此时,head指向头节点,r指向尾节点,r!=head,加入第三个节点时,r-next = s 就不能说相当于head-next = s了,r-next = s与head-next = s相当只是在加入第二个节点时有效