似乎无法在C的链表中获得打印功能

时间:2019-06-27 04:02:52

标签: c data-structures linked-list

无法打印链表,它陷入了无限循环,无法理解我要去哪里。

#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次。请帮忙。

1 个答案:

答案 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的值无法在任何地方访问。所以那不可能是正确的。

最后:

我认为您并未提出正确的问题。您要求我们解释您出了问题的地方,而我已经做到了。但我认为这不是您真正需要的。也许您需要帮助开发算法来解决问题?也许会问一个新问题,描述您认为算法应该是什么(只是用文字,无需使用代码),并寻求帮助来修复算法。

直言不讳,错误的数量表明您正在尝试的工作远远超出了您的知识范围。这令人沮丧,也不是学习编程的好方法。您应该认真考虑首先尝试更简单的任务。

您可能已经删除了它,以使问题更简单,但是您的真实代码应包含很多额外的检查和日志记录,以帮助您理解它。输入功能时记录。记录功能所做出的每个决定。记录返回的功能。这将帮助您确定程序的实际操作偏离了您认为应该执行的操作。或者,如果您愿意,可以学习使用平台的调试工具。这样,您将不会进行随机更改,而是希望它们使所有功能正常运行,而是会知道代码首先在哪里出错,并且能够一次确定一个问题,并且确信您不会破坏正在运行的事情。