c中的链表返回负数而不是添加节点

Posted

技术标签:

【中文标题】c中的链表返回负数而不是添加节点【英文标题】:Linked list in c returns negative number instead of adding node 【发布时间】:2022-01-10 12:31:20 【问题描述】:

有人可以向我解释为什么此代码返回一个随机负数而不是按应有的方式添加节点吗?如果删除了对 addnode 的调用,则 main 函数可以正常工作,因此问题出在 addnode 函数上。我不认为是 malloc 有问题,我一生都无法弄清楚是什么。请帮忙,我是 c 的业余爱好者,我对指针的工作原理有一个模糊的理解,所以我猜我的指针有问题。这是完整的代码:

#include <stdio.h>
#include <stdlib.h>

struct node

    int data;
    struct node *next;
;

int addNode(struct node **head, int value);
void printList(struct node **head);

int main()

    int value;
    
    struct node *head;
    head=NULL;
    //int isempty(struct node *head);
    for(int i=0;i<10;i++)
    
    printf("\nInsert node value :");
    scanf("%d",&value);
    addNode(&head,value);
    
    printList(&head);
     return 0;

int addNode(struct node **head,int value)
    
    struct node *newnode;
    newnode=(struct node *) malloc(sizeof(struct node));
    //if(newnode==NULL)
    if(!newnode)
    
    printf("Memory allocation error \n"); 
    exit(0);
    
    
    if(*head=NULL)
    
        newnode->data=value;
        newnode->next=NULL;
        *head=newnode;
        return 1;
    
    else
    
        
        struct node *current;
        *current = **head;
        while(current != NULL)
        
            if(value<=(current->data))
                //περίπτωση 1ου κόμβου σε μη κενή λίστα
                if(current==*head)
                    newnode->data=value;
                    newnode->next=*head;
                    *head=newnode;
                    return 1;
                
                //περίπτωση ενδιάμεσου κόμβου
                newnode->data=value;
                return 1;
            
            current = current->next;
        

    

/*int isempty(struct node *head)
    return (head==NULL);
*/

void printList(struct node **head) 
   struct node *ptr = *head;
   printf("\n[ ");
    
   //start from the beginning
   while(ptr != NULL) 
      printf("(%d) ",ptr->data);
      ptr = ptr->next;
   
   printf(" ]");
   return;

【问题讨论】:

*current = **head; 我觉得不合适。 确实,将其转换为 current=*head 可以使 main 正常工作,但 printlist 只打印:[]。我猜 addnode 仍然没有保存任何节点,也许我也弄乱了节点之间的字符串?谢谢你帮助我 注意:您的插入函数使用大约 30 行和 2 个变量。它可以压缩到大约 10 行和 1 个变量,增加了可读性。 【参考方案1】:

对于初学者来说,你是在 addNode 中进行分配而不是比较

if(*head=NULL) should be if(*head==NULL)

除此之外,我认为您正在尝试以排序方式维护元素?但无论如何,你对指针的操作比你需要的多一点。

【讨论】:

是的,抱歉,我忘了提到该列表应该是递减的。我完全错过了==,谢谢。现在它只打印第一个节点,但我想我至少现在可以理解我可能出错的地方。感谢您的帮助! 一些调整和功能现在可以正常工作。感谢您和 Harvey 先生的帮助,你们是救命稻草

以上是关于c中的链表返回负数而不是添加节点的主要内容,如果未能解决你的问题,请参考以下文章

过滤链表并返回新的链表 C

javascript中的链表结构—从链表中删除元素

链表-LeetCode24两两交换链表中的节点

如何将我自己的链表中的迭代器定义为 Java 中的节点?

Java数据结构带有虚拟头节点的链表

Java数据结构带有虚拟头节点的链表