创建链表时的无限循环
Infinite loop in creation of linked list
为了创建链表,我将新节点设为静态节点而不是动态节点,现在我的显示函数循环转换为无限循环,为什么?
节点结构
#include <stdio.h>
typedef struct node
{
int data;
struct node* next;
}node;
我所做的唯一更改是在此函数中,并且在更改后它也能正常工作。
node * createLinkedList(int n)
{
int i=0;
node * head=NULL;
node * temp=NULL;
node * p=NULL;
for(i=0;i<n;i++)
我从这里更改了我的代码而不是写
temp=(node *)malloc(sizeof(node));
我做了一个静态节点"x"。
{
node x; // instead of malloc I made a static node.
x.next=NULL;
printf("Enter data in node %d: ",i+1);
scanf("%d",&(x.data));
temp=&x;
if(head == NULL)
{
head=temp;
}
else
{
p=head;
while(p->next != NULL)
{
p=p->next;
}
p->next=temp;
}
}
return head;
}
这是显示函数,这里的修改引起了问题
void display(node * p)
{
node * temp=p;
就是在这里转换成无限循环。
while(temp->next != NULL)
{
printf("\t%d->",temp->data); //Due to static node this became an infinite loop , Why?
temp=temp->next;
}
}
为什么会这样,当我动态分配内存时这个程序运行良好,但是在将静态节点作为新节点后,正在创建一个无限循环???
主要问题不在你的显示函数,而是在你创建链表的时候。
在函数中声明为静态的变量会保留其状态,因此基本上它的地址将始终相同。
在您的情况下,您的 x 仅初始化一次并始终保留相同的地址。
在循环的第一次迭代中,temp 将具有与 x 相同的地址,head 将具有与 x 相同的地址。
node x; // instead of malloc I made a static node.
x.next=NULL;
printf("Enter data in node %d: ",i+1);
scanf("%d",&(x.data));
temp=&x;
if(head == NULL)
{
head=temp;
}
然后在循环的第二次迭代中 x 保留它的旧地址,然后再次使用相同的地址。这次我们转到 else 部分,p 将有 head 的地址,即 x 的地址。现在 p->next 将指向 temp 的地址,这也是 x 的地址。
else
{
p=head;
while(p->next != NULL)
{
p=p->next;
}
p->next=temp;
}
所以 x 的地址在 temp, head, head->next 这就是你创建的静态节点的问题,因为你认为它每次都会创建新的实例。您创建的节点指向自己的地址。
为了创建链表,我将新节点设为静态节点而不是动态节点,现在我的显示函数循环转换为无限循环,为什么?
节点结构
#include <stdio.h>
typedef struct node
{
int data;
struct node* next;
}node;
我所做的唯一更改是在此函数中,并且在更改后它也能正常工作。
node * createLinkedList(int n)
{
int i=0;
node * head=NULL;
node * temp=NULL;
node * p=NULL;
for(i=0;i<n;i++)
我从这里更改了我的代码而不是写
temp=(node *)malloc(sizeof(node));
我做了一个静态节点"x"。
{
node x; // instead of malloc I made a static node.
x.next=NULL;
printf("Enter data in node %d: ",i+1);
scanf("%d",&(x.data));
temp=&x;
if(head == NULL)
{
head=temp;
}
else
{
p=head;
while(p->next != NULL)
{
p=p->next;
}
p->next=temp;
}
}
return head;
}
这是显示函数,这里的修改引起了问题
void display(node * p)
{
node * temp=p;
就是在这里转换成无限循环。
while(temp->next != NULL)
{
printf("\t%d->",temp->data); //Due to static node this became an infinite loop , Why?
temp=temp->next;
}
}
为什么会这样,当我动态分配内存时这个程序运行良好,但是在将静态节点作为新节点后,正在创建一个无限循环???
主要问题不在你的显示函数,而是在你创建链表的时候。
在函数中声明为静态的变量会保留其状态,因此基本上它的地址将始终相同。
在您的情况下,您的 x 仅初始化一次并始终保留相同的地址。
在循环的第一次迭代中,temp 将具有与 x 相同的地址,head 将具有与 x 相同的地址。
node x; // instead of malloc I made a static node.
x.next=NULL;
printf("Enter data in node %d: ",i+1);
scanf("%d",&(x.data));
temp=&x;
if(head == NULL)
{
head=temp;
}
然后在循环的第二次迭代中 x 保留它的旧地址,然后再次使用相同的地址。这次我们转到 else 部分,p 将有 head 的地址,即 x 的地址。现在 p->next 将指向 temp 的地址,这也是 x 的地址。
else
{
p=head;
while(p->next != NULL)
{
p=p->next;
}
p->next=temp;
}
所以 x 的地址在 temp, head, head->next 这就是你创建的静态节点的问题,因为你认为它每次都会创建新的实例。您创建的节点指向自己的地址。