1、尾插法
(1)不带头结点
typedef int ElementType;
typedef struct Node *List;
struct Node {
ElementType data;
struct Node *next;
};
List Create() {
List ptrL = NULL, s = NULL, tail = NULL;
int n;
printf("输入要创建的元素个数:");
scanf("%d", &n);
ElementType val;
for (int i = 0; i < n; i++) {
printf("请输入第 %d 个元素:", i + 1);
scanf("%d", &val);
s = (List)malloc(sizeof(struct Node));
s->data = val;
s->next = NULL;
if (i == 0) ptrL = s;
else tail->next = s;
tail = s;
}
return ptrL;
}
(2)带头结点
List Create() {
//创建头结点
List ptrL = NULL, s = NULL, tail = NULL;
ptrL = (List)malloc(sizeof(struct Node));
if (!ptrL) return NULL;
ptrL->next = NULL;
int n;
printf("输入要创建的元素个数:");
scanf("%d", &n);
ElementType val;
for (int i = 0; i < n; i++) {
printf("请输入第 %d 个元素:", i + 1);
scanf("%d", &val);
s = (List)malloc(sizeof(struct Node));
s->data = val;
s->next = NULL;
if (i == 0) ptrL->next = s;
else tail->next = s;
//保存尾节点的位置
tail = s;
}
return ptrL;
}
2、头插法
(1)不带头结点
List Create() {
List ptrL = NULL, s = NULL;
int n;
printf("输入要创建的元素个数:");
scanf("%d", &n);
ElementType val;
for (int i = 0; i < n; i++) {
printf("请输入第 %d 个元素:", i + 1);
scanf("%d", &val);
s = (List)malloc(sizeof(struct Node));
s->data = val;
s->next = NULL;
s->next = ptrL;
ptrL = s;
}
return ptrL;
}
(2)带头结点
List Create() {
List ptrL = NULL, s = NULL;
ptrL = (List)malloc(sizeof(struct Node));
if (ptrL == NULL) return NULL;
memset(ptrL, 0, sizeof(struct Node));
ptrL->next = NULL;
int n;
printf("输入要创建的元素个数:");
scanf("%d", &n);
ElementType val;
for (int i = 0; i < n; i++) {
printf("请输入第 %d 个元素:", i + 1);
scanf("%d", &val);
s = (List)malloc(sizeof(struct Node));
s->data = val;
s->next = NULL;
s->next = ptrL->next;
ptrL->next = s;
}
return ptrL;
}
写这篇博文的目的在于,对比 带和不带头结点 的尾插法或头插法,看有什么区别。区别仅在于是否带有头结点,思路是完全一样的!