我尝试在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位似乎有一个额外的元素?我做错了什么?
答案 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;
}
}
}