0

我正在用 C 编写一个单链表。这是我到目前为止所写的。

C program
#include<stdio.h>
#include<stdlib.h>

struct Node{
    int value;
    struct Node *next; 
};


struct Node* init()
{
   struct Node* head=NULL;
   head=malloc(sizeof(struct Node));
    head->value=-1;
    return head;

}



int length(struct Node* head)
{
    struct Node* current=head;
    int length=0;
    while(current!=NULL)
    {
        length++;
        current=current->next;

    }
    return length;

}


void print(struct Node* head)
{
   int i=0;
   int len=length(head);
   for(i=0;i<len;i++)
   {
    printf("%d%d",i,head[i].value);
    printf("\n");


   }


}




 struct Node* insert(int data,struct Node* head)
 {
    struct Node* current=NULL;
    if(length(head) > 0)
    {
        int val=head->value;        
        if (val==-1)
        {
            head->value=data;
            head->next=NULL;

        }
        else
        {
           current=malloc(sizeof(struct Node));
           current->value=data;
           current->next=head;
           head=current;


      }

  }
   else
  {
    printf("List is empty");

  }

  return head;


}

int main() 
{

/* printf("Hello"); */
struct Node *head=init();

head=insert(20,head);
head=insert(30,head);
head=insert(40,head);

print(head);
printf("%d",length(head)); 

return 0;

}

我得到的输出值为: Index Value 0 40 1 0 2 0

长度为 3。我无法理解我在指针操作中做错了什么。

4

4 回答 4

4

一个明显的问题是在初始化时没有在 NULL 旁边设置 - 在检查空列表的长度时会失败

但你真正的问题是打印功能

你不能使用:

head[i].value

该符号仅对数组有效,您需要使用 next 来查找每个成员

于 2012-09-23T06:07:09.907 回答
1

Init 函数应将 Next 设置为 NULL

struct Node* init()
{
   struct Node* head=NULL;
   head=malloc(sizeof(struct Node));
    head->value=-1;
    head->next=NULL;
    return head;

}

否则第一次调用 length 返回一个未定义的结果(或 GPF )。

于 2012-09-23T06:13:00.210 回答
1

这里:

    for (i = 0; i < len; i++)
    {
        printf("%d%d", i, head[i].value);
        printf("\n");
    }

您需要从一个节点前进到另一个节点,head = head->next方式与在length(). head[i]不会的。

目前还不清楚为什么你的init()insert()如此不必要的复杂,我什至不想猜测为什么。我想提出一个更好的insert()建议init()

struct Node* insert(int data, struct Node* head)
{
    struct Node* current;

    current = malloc(sizeof(struct Node));
    current->value = data;
    current->next = head;

    return current;
}

然后你这样做:

int main(void)
{
    struct Node *head = NULL;

    head = insert(20, head);
    head = insert(30, head);
    head = insert(40, head);

    print(head);
    printf("%d", length(head));

    return 0;
}
于 2012-09-23T06:21:28.560 回答
0

该表示法head[i].value仅对数组有效,对链表无效。数组和链表完全不同,向数组分配内存是有预谋的,而链表是动态的。这就是为什么我们对链表使用指针的原因。

init()您第一次调用时,您没有分配 null ,这会导致循环无限次运行length()

我发布了打印功能的修改代码:

void print(struct Node* head)
{
    int i=0;
    int len=0;
    struct Node* current=head;
    for(i=0;i<len;i++)
    {
        printf("%d %d",i,current->value);
        print("\n");
        current=current->next;
    }
}
于 2012-09-23T07:45:36.267 回答