我尝试用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;
}
答案 0 :(得分:1)
由于您要添加序列号,因此非常简单的循环可以解决这个问题:实际上,在您的实现中用cur
替换L->head
可以解决问题。
然而,更通用的方法是使用函数,C中代码重用的主要工具。您需要将typedef
移出main
,并编写函数{{1 }},addHead
,addTail
和deleteHead
:
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;
}
}