使用Structs创建和扩展链接列表

时间:2013-09-18 12:41:57

标签: c struct linked-list

我一直致力于C99中一个基于结构的程序。我发现我可以创建结构的链表,并考虑尝试一下。

以下是一次悲惨的尝试,重做了大约50次,这意味着要做到以下几点:

1)在main方法中创建一个BASE类型的结构,它包含一个链表(CHAIN)的头部。

2)将此BASE结构传递给另一个函数,该函数会将其他CHAIN元素附加到链表的末尾。

3)在main中打印链表元素,以证明更改不仅仅是在其他方法中。

#include <stdlib.h>
#include <stdio.h>
typedef struct Base {
    //many things
    struct Chain *head;
} BASE;

typedef struct Chain {
    int x;
    struct Chain *next;
} CHAIN;

void extendChain(BASE *Data, int length);

int main() {
    BASE Data;
    CHAIN *pointer;
    Data.head = 0;
    int length = 10; //userInput(); // gets integer
    extendChain(&Data, length);
    pointer = Data.head;
    while (pointer) {
        printf("%d\n", pointer->x);
        pointer = pointer->next;
    }
}

void extendChain(BASE *Data, int length) {
    CHAIN *position;
    position = Data->head;
    for (int i=0; i<length; ++i) {
        if (!Data->head) {
            // this will set the first value, the first time this is run.
            Data->head = malloc(sizeof(CHAIN));
            Data->head->x = -1; // set values here. Irrelevant.
            position = Data->head;
        } else if (position) {
            while (position->next) {
                position = position->next;
            }
            position = malloc(sizeof(CHAIN));
            position->next = 0;
            position->x = i; // placeholder
        }
    }
}

结果非常糟糕,我意识到我的榜样即使在理论上也没有开始工作(但我给了我最好的机会)。我开始认为这样做的唯一方法就是如果我用相同的方法完成所有操作,我之前成功设法做到这一点,但这很快会变得混乱,而且方法绝对是最好的。

当只传递包含此链接列表标题的结构时,是否有人有创造性的方法将X元素添加到链表中?非常感谢,一如既往。

2 个答案:

答案 0 :(得分:1)

代码中的逻辑错误。这段代码有效:

void extendChain(BASE *Data, int length) {
    CHAIN *position;
    position = Data->head;
    int i;·
    for (i=0; i<length; ++i) {
        if (!Data->head) {
            // this will set the first value, the first time this is run.
            Data->head = malloc(sizeof(CHAIN));
            Data->head->x = -1; // set values here. Irrelevant.
            Data->head->next = NULL; // <========= 
            position = Data->head; 
        } else if (position) {
            while (position->next) {
                position = position->next;
            }
            CHAIN * position_new_node = malloc(sizeof(CHAIN)); // <========= 
            position_new_node->next = 0; // <========= 
            position_new_node->x = i; // placeholder // <========= 
            position->next = position_new_node; // <========= 
        }
    }
}

答案 1 :(得分:0)

算法

创建原始链接列表 将要添加的链接列表发送到该功能 遍历直到第一个链表的末尾(让指针为t) 重复:     t =新链接列表的下一个节点旁边的节点     将两个节点向前移动一个单元 直到新链表的下一个节点为空