将节点附加到链接列表

时间:2015-09-09 06:33:01

标签: c linked-list

因此,当我将节点插入NULL单元时,此代码工作正常。我尝试将其实现为将单元格发送到开头,但从那时起,display_list函数仅显示最后一个单元格。我一直想弄明白这一点。建议?

我将补充一点,这应该是一个在Linux中模仿dc的函数。

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

struct CELL {
  int val;
  struct CELL *next;
};

void append_node(struct CELL *llist, int num);
void display_list(struct CELL *llist);

主要似乎很好

int main(void)
{

  int num = 0;
  int first = 0;
  int input = 0;
  char quit = 'n';
  char inputchar = ' ';

  struct CELL *llist;

  llist = (struct CELL *)malloc(sizeof(struct CELL));
  llist->next = NULL;

  while (quit == 'n'){

    if (scanf("%d", &input) == 1){

      if ( first == 1 )
        append_node(llist, input);


      if ( first == 0){
        llist->val = input;
        first = 1;
      }
    }

    else{
      inputchar = getchar();

      if (llist->next == NULL && first == 0)
        printf("List is empty.\n");

      if (inputchar == 'f')
        display_list(llist);

      if (inputchar == 'q')
        quit = 'y';
      else if (llist->next != NULL){
        switch (inputchar){

        case 'q':
        quit = 'y';
        break;
    }
      }
    }


  }
  free(llist);
  return 0;
}

注释掉的代码运行良好!直到我发现我应该将细胞添加到另一端,我很难搞清楚。我在这里缺少什么?

void append_node(struct CELL *llist, int num) {
  /* while(llist->next != NULL)
     llist = llist->next;
  llist->next = (struct CELL *)malloc(sizeof(struct CELL));
  llist->next->val = num;
  llist->next->next = NULL;*/

  struct CELL *temp;
  temp = (struct CELL *)malloc(sizeof(struct CELL));
  temp->val = num;
  temp->next = llist;
  llist = temp;
}

void display_list(struct CELL *llist)
{
  while(llist->next != NULL) {
    printf("%d\n", llist->val);
    llist = llist->next;
  }
  printf("%d\n", llist->val);
}

我承认我很难知道何时应该使用指针,我怀疑我可能在某个地方遗失了一个。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

查看代码的这一部分,

void append_node(struct CELL *llist, int num) {
  struct CELL *temp;
  temp = (struct CELL *)malloc(sizeof(struct CELL));
  temp->val = num;
  temp->next = llist;
  llist = temp;   // Line1
}

注意第1行:当您将llist更改为指向新节点时,您正在更改llist的本地副本,而main中的llist继续保留其旧值。

我该如何纠正?

这是您设计链表时的一个缺陷。客户端程序(main)根本不应访问CELL结构。你应该有另一个表示链表的结构,并有一个指向第一个单元格的指针。

像这样,

struct LinkedList {
  struct CELL *head;
};

您的main应该使用此结构,而不是CELL

我在代码中看到的其他内容很少,

1)display_list函数将失败,如果NULL传递给它。这样做可能会更好,

void display_list(struct CELL *llist)
{
  while(llist != NULL) {
    printf("%d\n", llist->val);
    llist = llist->next;
  }
}

2)在main

的末尾看到此行
free(llist);

您只释放链接列表中的第一个单元格。您尚未释放添加到列表中的其他单元格。这将导致您的计划中出现Memory leak

我该如何解决这个问题?释放链表不应该由客户端(主)代码完成。您应该提供另一个函数,它将递归释放所有已分配的单元格。同样,如果您按照上面建议的设计使用表示链表的结构,这会更容易。

编辑:在评论部分中添加了一个请求示例。

如果您将设计更改为我建议的内容,您的显示将如下所示

void display_list(struct LinkedList *llist)
{
  struct CELL * head = llist->head;
  while(head != NULL) {
    printf("%d\n", head->val);
    head = head->next;
  }
}