0

我想使用双指针创建一个列表并使用 void 作为返回。

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

typedef struct list{
   int value;
   struct list *next;
}*list;

void addnode(struct list **List, int number) {
   if(*List == NULL) {
      *List = (struct list*)malloc(sizeof(struct list*));
      (*List)->value = number;
      (*List)->next = NULL;
   } else {
      while((*List)->next != NULL) {
         (*List) = (*List)->next;
      } 
      *List = (struct list*)malloc(sizeof(struct list*));
      (*List)->value = number;
      (*List)->next = NULL;
   }
}

int main() {
   list List1 = NULL;

   addnode(&List1, 20);

   printf("%d \n", List1->value);

   addnode(&List1, 30);
   printf("%d \n", List1->value);
   printf("%d \n", List1->next->value);
   return 0;
}

addnode 中的第一个 if 始终执行,但如果列表不为空,我想追加列表,但它似乎永远不会工作。也会出现分段错误,因为在最后一个 printf 中它试图获取列表中的下一个元素,但它从未像我想要的那样初始化。

如果一切如我所愿,我应该打印出来

 printf("%d\n", List1->value) 

20

 printf("%d\n", List1->value)

20

printf("%d\n", List1->next->value)

30

4

3 回答 3

0

像这样修改你的程序

int addNode(struct list **List, int number)
{
    struct list *new, *tmp;             // new = create new node, tmp = navigate to last

    new = malloc(sizeof(struct list));
    if(!new) {                         //always validate "malloc"
            perror("malloc");
            exit(1);
    }

    new -> value = value;             // assigning values to new node
    new -> next = NULL;

    if(!(*list)) {               //Check if list is empty or not, plz initialize *list@main() with NULL as like your program. or write seperate function to initialize
            *list = new;  
            return 0;            //no need write else condition, bcoz its the first node. and u can directly return
    }

    tmp = *list;
    while(tmp -> next)            // To navigate to last node
            tmp = tmp -> next;
    tmp -> next = new;            //creating link to new node
    return 0;
}

最好单独编写print函数。

 int print(struct list **list)
 {
    struct *current;      //current is your current node position
    current  = *list;

    while(current) {       //loop till current node addr == NULL
            printf("%d\t", current -> value);
            current = current -> next;
    }

    printf("\n");
    return 0;
}
于 2013-10-06T14:13:01.383 回答
0

如果您尝试添加新的列表项,请记住(*List)->next已经NULL在第二次调用中。以下malloc使用NULL列表项 ( *List) 之前的指针,当它应该分配给下一个列表项时,即NULL,使其非NULL( (*List)->next=malloc(struct list);)。

此外,您malloc应该使用sizeof(struct list),而不使用*. 如果添加*,则分配struct list **. 您可以使用的规则是使用*比目标类型少一个作为sizeof操作数。由于您的目的地是*List类型struct list *,请使用sizeof(struct list). 或者,因为您的目标是*List,所以使用sizeof **List*比目标变量多使用一个)。这样可以避免您需要知道类型。是否List*List是否NULL因为sizeof操作先执行无关紧要;指针解引用永远不会发生,因为sizeof它适用于变量的类型。

于 2013-10-06T13:56:46.087 回答
0

您传递给的尺寸malloc是错误的。

您正在分配 a struct list,而不是 a struct list *

于 2013-10-06T13:01:25.313 回答