【问题标题】:C LinkedList won't workC LinkedList 不起作用
【发布时间】:2016-05-30 16:47:32
【问题描述】:

我正在尝试在 C 中构建自己的 LinkedList 几个小时,但我无法使其正常工作。请指出此代码出错的位置和原因。对于实际行为,向下滚动到“main”。

struct List {
  struct Node * head;
} list;

struct Node {
  int data;
  struct Node * next;
} node;

void
add(struct List* list, int z){

  //add as first element
  if(list -> head == NULL){
    list -> head = malloc(sizeof(struct Node));
    (list -> head) -> data = z;
    (list -> head) -> next = NULL;
    return;
  }

  //add to tail
  struct Node * curr = list -> head;

  while((curr -> next) != NULL){
    curr = curr -> next;
  }

  list -> head = malloc(sizeof(struct Node));
  (list -> head) -> data = z;
  (list -> head) -> next = NULL;
  return; 
}

void
printNode(struct Node * node){

  if(node == NULL){
    printf("NULL\n");
    return;
  }

  printf("%d -> ", node->data);
  printNode(node->next);

}

void
printList(struct List * list){
  if(list->head == NULL)
    printf("empty\n");
  else
    printNode(list->head);
}

由于某种原因,“添加”似乎确实以某种方式改变了传递的列表,使得只有最后一个元素保留在那里。我已经多次重写了程序——递归和迭代——结果似乎总是这样。

int
main(){

  struct List myList;
  myList.head = NULL;

  printList(&myList); // empty  
  add(&myList, 1);
  printList(&myList); // 1 -> NULL
  add(&myList, 2);
  printList(&myList); // 2 -> NULL, should be 1 -> 2 -> NULL
  add(&myList, 3);
  printList(&myList); // 3 -> NULL, should be 1 -> 2 -> 3 -> NULL
  add(&myList, 4);
  printList(&myList); // 4 -> NULL, should be 1 -> 2 -> 3 -> 4 -> NULL
}

我什至用其他语言重新创建了该程序,以查看程序中是否存在任何突破性的逻辑缺陷,但在其他地方我立即让它工作。

【问题讨论】:

  • 只要拿一张纸,为add()中的每个变量写列,然后为add()中的每一行代码写行。每个步骤中每个变量的值是多少。你很快就会看到。
  • johannes 的回复是正确的,但你的程序也非常低效。您应该将新元素添加到列表的开头,或者将指针存储到列表结构中的最后一个节点。这就是列表的全部意义所在。
  • 调试器.......................

标签: c singly-linked-list


【解决方案1】:

在您的程序中,您正在搜索最后一个元素:

while((curr -> next) != NULL){
  curr = curr -> next;
}

这是正确的,但是你正在改变头部:

list -> head = malloc(sizeof(struct Node));
(list -> head) -> data = z;
(list -> head) -> next = NULL;

相反,您应该创建一个新元素并更改当前结束的next 指针:

struct Node *new_data = malloc(sizeof(struct Node));
new_node -> data = z;
new_node -> next = NULL;
curr -> next = new_node;

【讨论】:

  • 哦,好吧,你当然是完全正确的。现在我感觉 非常 愚蠢,因为没有发现那个错误..
【解决方案2】:

看起来你需要决定是要添加到头部还是尾部......看起来你正在尝试添加到头部,但是你会做下一个当前而不是空...

list -> head = malloc(sizeof(struct Node));
(list -> head) -> data = z;
(list -> head) -> next = NULL; // HERE <-- next is NULL

而不是:

list -> head = malloc(sizeof(struct Node));
(list -> head) -> data = z;
(list -> head) -> next = curr;

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 2018-06-24
    • 2011-10-14
    • 2017-08-04
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多