链表初始化

时间:2014-11-04 05:40:55

标签: c list

我尝试在C中创建一个链表,但是我在列表中得到的元素比我预期的多一个。

#define SIZE_OF_LIST 10 

int main()
{
  struct node* head = NULL;
  struct node* item = NULL;

  int i;

  head = (struct node*)malloc(sizeof(struct node));
  item = (struct node*)malloc(sizeof(struct node) * 10);

  head->data = 999;
  head->link = item;

  // Create a list of 10 elements
  for (i = 0; i < SIZE_OF_LIST; i++)
    {
      (item+i)->data = i;
      printf("(item+%d)->data = %d\n",i,i);
      if (i<SIZE_OF_LIST-1)
      {
          (item+i)->link = (item+i+1);
           printf("(item+%d->link = (item+%d+1);\n", i, i);
      }
      else 
      {
          (item+i)->link = NULL;
          printf("(item+%d->link = NULL;\n", i);
      }
    }

  printf("Items : %d\n", getListLength(head));
  PrintListData(head);
  return 0;
}

所以我创建了2个函数。一个用于确定列表的长度,通过遍历节点直到找到结束节点(link = NULL)。 我创建了一个打印出列表数据的函数。

void PrintListData(struct node* list)
{
  int i = 0;
  int list_length = getListLength(list);

  for (i = 0; i < list_length; i++)
  {
      printf("List[%d] = %d\n", i, (list+i)->data);
  }
}

所以我希望列表在列表中保留+10个项目,但我的输出是:

Items : 12
List[0] = 999
List[1] = 0
List[2] = 0
List[3] = 1
List[4] = 2
List[5] = 3
List[6] = 4
List[7] = 5
List[8] = 6
List[9] = 7
List[10] = 8
List[11] = 9

所以在列表的第1位似乎有一个额外的元素?我做错了什么?

2 个答案:

答案 0 :(得分:2)

您对PrintListData的实施是错误的。它应该是:

void PrintListData(struct node* list)
{
   int index = 0;
   for ( ; list != NULL; list = list->link, ++index )
   {
      printf("List[%d] = %d\n", index, list->data);
   }
}

看看你如何实施PrintListData,我猜你在getListLength

中有类似的错误

getListLength的实现应该是这样的:

int getListLength(struct node* list)
{
   int len = 0;
   for ( ; list != NULL; list = list->link, ++len );
   return len;
}

答案 1 :(得分:1)

上述答案正确指出了问题。按照链接列表的语义,我宁愿实现你的功能:

int getListLength(struct node *head) {
  struct node *current = head;
  int len = 0;
  if (current) {
    while(current->link != NULL) {
      len ++;
      current = current->link;
    }
  }
  return len;
}

void PrintListData(struct node* head) {
  int index = 0;
  struct node *current = head;
  if (current) {
    while(current != NULL) {
      printf("List[%d] = %d\n", index, current->data);
      index ++;
      current = current->link;
    }
  }
}