c中的链表returns负数而不是添加节点
Linked list in c returns negative number instead of adding node
有人可以向我解释为什么这段代码 returns 是一个随机负数,而不是按应有的方式添加节点吗?如果删除对 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;
}
对于初学者来说,您在 addNode
中有一个赋值而不是比较
if(*head=NULL) should be if(*head==NULL)
除此之外,我认为您正在尝试以排序的方式维护元素?但是无论如何,您对指针的操作比您需要的要多一些。
有人可以向我解释为什么这段代码 returns 是一个随机负数,而不是按应有的方式添加节点吗?如果删除对 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;
}
对于初学者来说,您在 addNode
中有一个赋值而不是比较if(*head=NULL) should be if(*head==NULL)
除此之外,我认为您正在尝试以排序的方式维护元素?但是无论如何,您对指针的操作比您需要的要多一些。