文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 前言
- 一、头节点和头指针
- 二、不带头节点
- 三、带头节点
- 三、完整代码展示
前言
本文实现带头结点和不带头节点的单链表的建立,是王道数据结构的一道示例,使用头插法。本文使用的数据结构:
typedef struct Node {
int data;
struct Node* next;
}NODE,* LinkNode;
一、头节点和头指针
头节点:头节点它也是一个节点,它的里面有已经格式化好了。
头指针:它就是一个地址,里面没有格式化好,指针默认4个字节,不使用动态内存分配空间,这四个字节无法存储里面的成员,故现在这4个字节里面存的是一个随机的地址。
【注】下面L里面有一个16进制的地址,这里为了直观感受未格式化,故在里面空白。
代码如下(示例)边建立边输入数据,输入9999停止:
void create_no_head(NODE ** L)
{
NODE * n = NULL;//n是新节点
int x;
scanf("%d", &x);
while (x != 9999)
{
n = (LinkNode)malloc(sizeof(NODE));
n->data = x;
n->next = (*L);
(*L) = n;
scanf("%d", &x);
}
}
不带头结点,每次头指针L都会指向新节点,即头指针会保存当前新节点的地址。
三、带头节点代码如下(示例)边建立边输入数据,输入9999停止:
void create_head(NODE** L)
{
NODE * n = NULL;//n是新节点
int x;
(*L) = (LinkNode)malloc(sizeof(NODE));
(*L)->next = NULL;
scanf("%d", &x);
while(x != 9999)
{
n = (LinkNode)malloc(sizeof(NODE));
n->data = x;
n->next = (*L)->next;
(*L)->next = n;
scanf("%d", &x);
}
}
带头结点的头节点的下一个即L->next要指向新的节点,即L->next要保存新节点的地址。
# define _CRT_SECURE_NO_WARNINGS #include#include typedef struct Node { int data; struct Node* next; }NODE,* LinkNode; void create_no_head(NODE **); void create_head(NODE **); void show_no_head(NODE **); void show_head(NODE**); //void insert(); int main() { NODE * L = NULL; create_no_head(&L); show_no_head(&L); create_head(&L); show_head(&L); return 0; } void create_no_head(NODE ** L) { NODE * n = NULL; int x; scanf("%d", &x); while (x != 9999) { n = (LinkNode)malloc(sizeof(NODE)); n->data = x; n->next = (*L); (*L) = n; scanf("%d", &x); } } void create_head(NODE** L) { NODE * n = NULL; int x; (*L) = (LinkNode)malloc(sizeof(NODE)); (*L)->next = NULL; scanf("%d", &x); while(x != 9999) { n = (LinkNode)malloc(sizeof(NODE)); n->data = x; n->next = (*L)->next; (*L)->next = n; scanf("%d", &x); } } void show_no_head(NODE **L) { NODE* p = (*L); while (p) { printf("(%d) ", p->data); p = p->next; } printf("n"); } void show_head(NODE **L) { NODE* p = (*L)->next; while (p) { printf("(%d) ", p->data); p = p->next; } }
头指针是必须的,头节点不是必须存在的。



