为单链表编写适当的push()函数。

时间:2013-12-05 16:07:17

标签: c data-structures linked-list

http://cslibrary.stanford.edu/103/

请在此链接列表基础文档中找到一些时间来完成错误的推送功能。我只是遵循了这个函数的相同实现。因此,根据该文档,不应该向列表头部添加数据。但我的工作方式非常好,他们说必须实施。我很困惑找出问题所在?

以下是代码:

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

struct node{
    int data;
    struct node * next;
};

typedef struct node Node; /* Utilize a typedef for Node rather than typing
                             struct Node everytime we declare a node. */

Node* BuildOneTwoThree() {
    Node* head =NULL;   // pointer called head.
    Node* second =NULL; // pointer to second memory block
    Node* third = NULL; // pointer to third memory block

    head = (Node*)malloc(sizeof(Node));   //allocate a memory block of size node
                                          //in the heap and head pointer will 
                                          //point to this memory.
    second = (Node*)malloc(sizeof(Node)); //allocate a memory block of size node 
                                          //in the heap and second pointer will 
                                          //point to this memory
    third = (Node*)malloc(sizeof (Node)); //allocate a memory block of size node 
                                          //in the heap and third pointer will 
                                          //point to this memory

    head->data = 1;
    head->next = second; //the next pointer of node type will point to another 
                         //pointer of node type which is second!!

    second -> data = 2;
    second -> next = third;

    third -> data = 3;
    third -> next = NULL;
    return head;
}


Node* WrongPush(Node* head, int data) {

    Node* newNode = malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = head;
    head = newNode; // NO this line does not work!
    return head;
}

Node* WrongPushTest() {
    Node* head = BuildOneTwoThree();
    Node* current = WrongPush(head, 4);
    return current;
}

int main(){
    Node* ptr = WrongPushTest(); //My question is why does the wrong push 
                                 //test implementation that I setup work?
    while(ptr!=NULL) {
        printf("%d\n",ptr->data);
        ptr=ptr->next;
    }
}

1 个答案:

答案 0 :(得分:2)

我注意到的第一件事是你实际上改变了你引用的文档中所写的实现。该文档实现WrongPush如下(我修改为使用您的结构定义):

void WrongPush (Node * head, int data) {
    Node * newNode = malloc(sizeof(Node));

    newNode->data = data;
    newNode->next = head;
    head = newNode;  /* This will not work because you are not
                        modifying head in the calling function. */
}

您的实施问题是它不易扩展。例如,使用您的代码,尝试WrongPushTest,如下所示:

Node * WrongPushTest() {
    Node * head = BuildOneTwoThree();
    Node * current = WrongPush(head, 4);
    current = WrongPush(head, 5);
    current = WrongPush(head, 6);
}

输出不是程序员想要的。目标是使用推送功能,该功能利用原始head,而无需在每次将另一个节点推送到链接列表时创建新节点。他们在文档中使用的示例如下:

void Push(Node** headRef, int data) {
    Node * newNode = malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = *headRef;
    *headRef = newNode;
}

请注意,我没有像您的示例中那样返回指向新创建的头部的指针。以上允许我们通过直接操作原始head指针将新节点推送到原始链表的头部。

Node * PushTest() {
    Node * head = BuildOneTwoThree();
    Push (&head, 4);
    Push (&head, 5);
    Push (&head, 6);
    return head;
}

希望这有助于为您解决问题!