无法打印链表,它陷入了无限循环,无法理解我要去哪里。
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}node;
node *head = NULL;
void print(node *head){
node *temp = head;
while(temp!=NULL);
{
printf("%d => ",temp->data);
temp = temp->next;
}
printf("NULL");
}
node *clist(int n){
node *temp = NULL;
node *p = NULL;
int i;
for(i=0;i<n;i++)
{
temp = (node*)malloc(sizeof(node));
printf("Enter the elements of the list.\n");
scanf("%d",&temp->data);
}
if(head!=NULL)
{
while(p->next!=NULL)
p=p->next; //shifting p here node by node
p->next = temp; //last node which was just created
}
else
{
head = temp;
}
return head;
}
node *binsert(int x){
node *temp = NULL;
node *p = NULL;
temp = (node*)malloc(sizeof(node));
if(head!=NULL)
{
temp->next = head;
temp = head;
}
else
{
p = head = temp;
}
return head;
}
int main ()
{
int a, s, i, n,f;
printf("Choose an option : \n1.Create a list.\n2.Exit.\n");
scanf("%d",&s);
switch(s)
{
case 1:
printf("Very Well! Input the number of nodes\n");
scanf("%d",&n);
head = clist(n);
printf("Link List created successfully.\n");
print(head);
break;
default:
exit (0);
}
printf("Choose the operation you want to perform on the linked list:\n1.Add an element to the beginning.\n2.Add an element to the end.\n3.Add an element at a a particular position.\n");
scanf("%d",&a);
switch(a)
{
case 1:
printf("Enter the element you want to insert at the beginning.\n");
scanf("%d",&f);
binsert(f);
printf("Inserted Successfully.\n");
print(head);
break;
case 2:
printf("Error E162B");
}
return 0;
}
我尝试将head更改为全局变量。重新编写代码7次。请帮忙。
答案 0 :(得分:0)
第一:
for(i=0;i<n;i++)
{
temp = (node*)malloc(sizeof(node));
printf("Enter the elements of the list.\n");
scanf("%d",&temp->data);
}
此循环重复多次,以便用户可以输入列表的元素。但是它永远不会将任何节点添加到链表中。循环的每次迭代都会更改temp
,以指向新分配的节点,但不会将节点添加到链接列表中。
第二:
while(temp!=NULL);
这是一个无休止的循环。如果temp
不是NULL
,则循环中的任何地方都不会更改它,因此它将永远不会变成NULL
。你不想要那个分号。
第三:
node *head = NULL;
void print(node *head){
node *temp = head;
不要对自己这样做。您有一个名为head
的全局变量,并且有一个名为head
的参数。当您执行node *temp = head;
时,所指的是哪个 head
有多明显。如果两个变量的作用域重叠,则不要使用相同的名称。
第四:
if(head!=NULL)
{
temp->next = head;
temp = head; // **** here
}
else
{
p = head = temp;
}
return head;
temp = head;
的意义是什么? temp
的值无法在任何地方访问。所以那不可能是正确的。
最后:
我认为您并未提出正确的问题。您要求我们解释您出了问题的地方,而我已经做到了。但我认为这不是您真正需要的。也许您需要帮助开发算法来解决问题?也许会问一个新问题,描述您认为算法应该是什么(只是用文字,无需使用代码),并寻求帮助来修复算法。
直言不讳,错误的数量表明您正在尝试的工作远远超出了您的知识范围。这令人沮丧,也不是学习编程的好方法。您应该认真考虑首先尝试更简单的任务。
您可能已经删除了它,以使问题更简单,但是您的真实代码应包含很多额外的检查和日志记录,以帮助您理解它。输入功能时记录。记录功能所做出的每个决定。记录返回的功能。这将帮助您确定程序的实际操作偏离了您认为应该执行的操作。或者,如果您愿意,可以学习使用平台的调试工具。这样,您将不会进行随机更改,而是希望它们使所有功能正常运行,而是会知道代码首先在哪里出错,并且能够一次确定一个问题,并且确信您不会破坏正在运行的事情。