有人能向我解释一下为什么这段代码会返回一个随机负数,而不是按照应该的方式添加节点吗?如果删除了对addnode的调用,那么主函数将正常工作,因此问题出在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;
}
对于初学者来说,您在addNode 中有一个赋值而不是比较
if(*head=NULL) should be if(*head==NULL)
除此之外,我认为您正在尝试以排序的方式维护元素?但在任何情况下,你操纵指针的次数都比你需要的要多