c
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data; // 数据域
struct LNode *next; // 指针域
} LNode;
// ================== 尾插法创建:不带头结点 ==================
LNode *createTailNoHead() {
LNode *L = NULL; // 空链表
LNode *tail = NULL; // 始终指向表尾结点
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
LNode *s = (LNode *)malloc(sizeof(LNode));
scanf("%d", &s->data);
s->next = NULL;
if (L == NULL) { // 也可写 if(tail == NULL)
L = tail = s;
} else {
tail->next = s;
tail = s;
}
}
return L;
}
// ================== 尾插法创建:带头结点 ==================
LNode *createTailWithHead() {
LNode *L = (LNode *)malloc(sizeof(LNode)); // 头结点,不存有效数据
L->next = NULL;
LNode *tail = L; // 尾指针初始指向头结点
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
LNode *s = (LNode *)malloc(sizeof(LNode));
scanf("%d", &s->data);
s->next = NULL;
tail->next = s;
tail = s;
}
return L;
}
// ================== 头插法创建:带头结点 ==================
LNode *createHeadWithHead() {
LNode *L = (LNode *)malloc(sizeof(LNode)); // 头结点
L->next = NULL;
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
LNode *s = (LNode *)malloc(sizeof(LNode));
scanf("%d", &s->data);
s->next = L->next;
L->next = s;
}
return L;
}
// ================== 遍历输出链表 ==================
void printList(LNode *L) {
// 如果不带头结点
LNode *p = L;
// 如果带头结点,用下面这句:
// LNode *p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// ================== 释放链表 ==================
void freeList(LNode *L) {
// 如果不带头结点
LNode *p = L;
// 如果带头结点,用:
// LNode *p = L;
while (p != NULL) {
LNode *q = p;
p = p->next;
free(q);
}
}
int main() {
// 示例:尾插法不带头
LNode *L1 = createTailNoHead();
printList(L1);
freeList(L1);
// 示例:尾插法带头
// LNode *L2 = createTailWithHead();
// printList(L2);
// freeList(L2);
// 示例:头插法带头
// LNode *L3 = createHeadWithHead();
// printList(L3);
// freeList(L3);
return 0;
}
尾插不带头:
c
if (L == NULL) {
L = tail = s;
} else {
tail->next = s;
tail = s;
}
尾插带头:
c
LNode *L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
LNode *tail = L; // 尾指针指向头结点
// 每次插入新结点 s
tail->next = s; // 头/尾结点 next 指向新结点
tail = s; // 尾指针移动到新结点
s->next = NULL; // 新结点成为尾结点
头插带头:
c
s->next = L->next;
L->next = s;

