【问题标题】:Modified Linked List in C ProgrammingC 编程中的修改链表
【发布时间】:2015-02-15 06:56:41
【问题描述】:

所以我有一个链表,我试图在添加新节点时反向创建链表。所以我的链表包含两条数据和一个指向下一个对象的指针。当我添加一个新节点时,我希望该节点指向当前的链表。我试过这样做,以便将当前列表的下一个指针指向当前链接列表,然后更改当前链接列表中的数据,但我无法让它工作。

下面是我的代码和我尝试过的。它只是给了我一个指向自身的循环链表。

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

struct Node *list;

void create() {
    list = malloc(sizeof(struct Node));
}

void add(*data, int value){
    if (list->value != 0){
        list->next = list;
    }

    list->data = mem_address /* memory address of some item */;
    list->value = value;
}

所以第一个节点被正确添加,但是一旦我添加了第二个节点,它只是一个链接列表,其 next 的值指向自身,本质上是一个循环链接列表。谁能帮帮我。

这里有一个例子让它更清楚一点。

create();
add(pointer, 12);
add(pointer2, 22);

所以它看起来像这样;

+-------+----------------+
| Data  | 0x7fecfbd4103c |
+-------+----------------+
| value |      22        |
+-------+----------------+
| next  |                |
+-------+----------------+

+-------+----------------+
| Data  | 0x7fdb9904a03c |
+-------+----------------+
| value |      12        |
+-------+----------------+
| next  |     NULL       |
+-------+----------------+

【问题讨论】:

    标签: c linked-list


    【解决方案1】:

    我想你想要更多这样的东西:

    struct Node {
        void *data;
        int value;
        struct Node *next;
    };   
    
    struct Node *list=NULL; 
    
    void create(){
       // list = malloc(sizeof(struct Node)); 
    
       //Does nothing. Not required.
    }
    
    void add(void *data, int value){
        struct Node *node = malloc(sizeof(struct Node));
        node->data=data;
        node->value=value;
        node->next=list;
        list=node;
    }
    
    void destroy(){
        while(list!=NULL){
            struct Node* next=list->next;
            free(list);
            list=next;
        }
    }
    

    列表初始化为空。所以你不需要你的create() 函数。 但是,当您完成列表后,您应该致电destroy()。 如果那是在程序结束时,您实际上不需要调用它 - 环境将回收内存。不过这是个好习惯。

    【讨论】:

      【解决方案2】:

      听起来你需要两个基指针(list 和 list_end)

      这样你安排'list'指向链中的第一个条目,'list_end'指向最后一个,你可以在任一端添加新节点。

      如果您在跟踪指针时遇到问题,最后带有按钮的纸片和字符串可能会有所帮助:-)

      另外,请注意,您应该确保清除 malloc 返回的内存或始终设置所有字段。 (即:将“下一个”设置为零)

      嗯;你也必须为每个列表节点做一个 malloc。

      【讨论】:

        【解决方案3】:

        您需要更改您的add() 方法,如下所示。而且您的add() 方法还需要struct Node(至少某种类型)的指针类型,否则它会引发编译器错误

        void add(struct Node *data, int value); // Corrected add method prototype
        

        并更正add() 方法

        void add(struct Node *data, int value){
               data->value = value;
               data->next=list;
               list=data;
        }
        

        一个工作示例:

        #include <stdio.h>
        #include <stdlib.h>
        
        struct Node {
        void *data;
        int value;
        struct Node *next;
        };   
        
        struct Node *list;
        
        void add(struct Node *data, int value);
        
        int main()
        {
            printf("Hello, World!\n");
        
            // Defining END node
            list = malloc(sizeof(struct Node));
            list->value = -1;
            list->next=NULL;
        
            // Adding data
            struct Node* temp=malloc(sizeof(struct Node));     
            add(temp,12);
        
            temp=malloc(sizeof(struct Node));     
            add(temp,20);
        
            temp=malloc(sizeof(struct Node));       
            add(temp,22);
        
            // Use Head to walk through the linked list
            temp=list;
        
           // Walk through it and verify order
            while(temp!=NULL){
                printf("%d \n",temp->value);
                temp=temp->next;
            }
        
            return 0;
        }
        
        void add(struct Node *data, int value){
               data->value = value;
               data->next=list;
               list=data; // list will always be the HEAD
        }
        

        输出:

        20
        12
        -1
        

        【讨论】:

          猜你喜欢
          • 2012-04-02
          • 1970-01-01
          • 2020-03-22
          • 2018-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多