有没有更简单的方法来创建具有给定结构的链表?

时间:2018-03-19 06:47:56

标签: c linked-list

我尝试用for循环但是我没有成功。这是我当前的实现,它创建了一个包含6个元素的链表,但我确信有一种方法可以用循环来完成它,因为我的代码非常繁琐。

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

int main(void) {
    typedef struct _node {
        int data;
        struct _node * next;
    } node_t;

    typedef struct {
        node_t * head;
        node_t * tail;
    } LL_t;

    LL_t* L = malloc(sizeof(LL_t));

    L->head=malloc(sizeof(node_t));
    L->head->data=0;

    L->head->next=malloc(sizeof(node_t));
    L->head->next->data=1;

    L->head->next->next=malloc(sizeof(node_t));
    L->head->next->next->data=2;

    L->head->next->next->next=malloc(sizeof(node_t));
    L->head->next->next->next->data=3;

    L->head->next->next->next->next=malloc(sizeof(node_t));
    L->head->next->next->next->next->data=4;

    L->head->next->next->next->next->next=malloc(sizeof(node_t));
    L->head->next->next->next->next->next->data=5;

    L->head->next->next->next->next->next->next=NULL;
    L->tail=L->head->next->next->next->next->next;

    return 0;
}

这是我的for循环无效。

node_t* cur = L->head;
for (int i = 0; i < 6; i++) {
    cur = malloc(sizeof(node_t));
    cur->data = i;
    printf("%d\n", cur->data);
    if (i == 5) {
        cur->next = NULL;
        L->tail = cur;
        break;
    }
    cur = cur->next;
}

2 个答案:

答案 0 :(得分:1)

由于您要添加序列号,因此非常简单的循环可以解决这个问题:实际上,在您的实现中用cur替换L->head可以解决问题。

然而,更通用的方法是使用函数,C中代码重用的主要工具。您需要将typedef移出main,并编写函数{{1 }},addHeadaddTaildeleteHead

deleteTail

现在,您可以在void addTail(LL_t *list, int val) { LL_t *n = malloc(sizeof(node_t)); n->data = val; n->next = NULL; if (list->tail) { list->tail->next = n; } list->tail = n; if (!list->head) { list->head = n; } } 中使用addTail,无论是否有循环。

答案 1 :(得分:1)

此代码将循环并创建您指定的许多节点:

int num_nodes = 6;
node_t *L = NULL;
node_t *n;
node_t *tail = NULL;

for (int i = 0; i < num_nodes; i++) {
    n = malloc(sizeof(*n));
    if (n == NULL) {
        exit(1);
    }

    // fill in new node
    n->data = i;
    n->next = NULL;

    // save pointers to the first node we create
    if (L == NULL) {
        // save head pointer
        L = n;

        // save tail pointer
        tail = n;
    } else {
        // link node into list, move tail pointer to newly created node
        tail->next = n;
        tail = n;
    }
}