在打印链接列表数据时

时间:2018-08-13 04:38:38

标签: c memory data-structures linked-list dynamic-memory-allocation

我为用户编写了此代码,以便在列表中输入他们想要的节点数以及每个节点的元素。仅当我尝试打印列表的值时,才会发生我的错误。好像我只是在打印列表的第一个值。否则,或者我没有将数据分配给列表。

注意“ list.h”仅包括stdio和stdlib库以及struct定义。它只保存数据和指向相同结构的指针。

#include "list.h"

struct node *head = NULL;

void print_data(){

  struct node* temp;
  temp = head;

  printf("\n\n");

  while(temp != NULL){

    printf("%d ", temp->data);
    temp = temp->next;

  }
}

void insert(data){

  struct node *temp = malloc(sizeof(struct node));
  struct node *p;

  temp->data = data;
  temp->next = NULL;

  if( head == NULL ){

    head = temp;

  }else{

    p = head;

    while( p->next != NULL){

      p = p->next;
      p->next = temp;

    }
  }
}

int main(){

  int i, amount, element;

  printf("\nEnter Amound of Nodes: \n");
  scanf(" %d", &amount);

  for( i = 0; i < amount; ++i){

    printf("\nEnter Node #%d amount ", i + 1);
    scanf(" %d", &element);
    insert(element);

  }

  print_data();

}

3 个答案:

答案 0 :(得分:2)

您的插入错误。假设您要在链表的最后插入节点。但是您的代码在列表的开头插入了节点,但未正确处理列表的其余部分。因此,您列表的其余部分将丢失。

while( p->next != NULL){

      p = p->next;
      p->next = temp;
}

应该是

while( p->next != NULL){

      p = p->next;

}
     p->next = temp;

答案 1 :(得分:1)

while函数的insert中,您将从第二个元素开始为每个元素分配temp。您必须先到达列表的末尾,然后再将其添加到列表中。因此,将分配移到while循环之外。

答案 2 :(得分:0)

我通常会推到列表的开头,而不是结尾。 即:

my_struct_t tmp-> next = list_head;

list_head = tmp;

这样,您避免每次需要添加到列表时都循环到列表末尾。