【数据结构】建立单链表(C语言)

本文介绍了如何使用C语言建立单链表,包括链表节点的结构、节点之间的链接方式以及如何通过头指针访问链表。文章还提到了创建链表时定义结构体的重要性,并且讨论了节点插入的过程。最后,作者强调了程序结束时释放内存的重要性。

想要实现链表的节点插入,我们得先理解链表的结构是如何形成的

首先,一个单链表是由一个表头一个表尾和若干个节点链接而成.

每一个节点大致分为两个区域:数据域------用于存放你想要存储的数据;

                                                   指针域------用于链接下一节点。

那每个节点是如何链接的呢?

 大概就是如图所示的方式链接而成,即由上一个节点的指针域中的指针(假设为*next)指向下一个节点(整个节点,在这笔者误解了好久一直以为是上一个节点的指针域指向下一个节点的指针域....),这样就完成了链表的链接。

 那么,如果我们要创建一个单链表,首先我们得需要一个表头,也就是头指针(头指针也是一个节点,但是是个空节点,注意头指针不等于头节点),有了这个头指针,我们就可以访问整个链表(因为这个头指针记录的就是链表的首地址)

于是

Node *head = NULL;

当然这一切的前提是笔者定义了一种结构体:

typedef struct _struct{
    int
尾插法建立单链表的 C 语言程序代码有两种常见实现方式,以下分别给出代码及运行结果: #### 代码一 ```c #include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct LNode{ ElemType data; struct LNode * next; }LNode, * LinkList; // 尾插法建立单链表,要改变头指针所以要引用& L LinkList ListTailInert(LinkList &L) { L = (LNode*)malloc(sizeof(LNode)); // 头结点 LNode * s, * r = L; // s 用来指向申请的新结点,r 始终指向链表尾部 int x; scanf("%d", &x); while (x != 9999) { s = (LNode*)malloc(sizeof(LNode)); // 为新结点申请空间 s->data = x; r->next = s; // 尾结点指向新结点 r = s; // r 指向新的尾部 scanf("%d", &x); } r->next = NULL; // 尾指针 return L; } void print_list(LinkList L) { L = L->next; while (L != NULL) { printf("%3d", L->data); L = L->next; } printf("\n"); } int main() { LinkList L; ListTailInert(L); // 输入 3 4 5 6 7 9999 print_list(L); return 0; } ``` 运行时,若输入 `3 4 5 6 7 9999`,运行结果为: ```plaintext 3 4 5 6 7 ``` #### 代码二 ```c #include <stdio.h> #include <stdlib.h> // 创建结点类型 typedef struct Node{ int data; struct Node *next; }Node, *LinkList; // 带有头结点的尾插法创建链表 LinkList CreateLinkList(int n) { LinkList head = (Node*)malloc(sizeof(Node)); head->next = NULL; Node *p; Node *temp = head; int i; for (i = 0; i < n; i++) { p = (Node*)malloc(sizeof(Node)); scanf("%d", &p->data); temp->next = p; temp = p; } temp->next = NULL; return head; } void Print(LinkList L) { L = L->next; while (L) { printf("%3d", L->data); L = L->next; } printf("\n"); } int main() { int n; printf("请输入你要创建链表的结点数目:\n"); scanf("%d", &n); LinkList L = CreateLinkList(n); printf("目前链表中元素为:\n"); Print(L); return 0; } ``` 运行时,若输入结点数目为 `3`,再依次输入 `1 2 3`,运行结果为: ```plaintext 请输入你要创建链表的结点数目: 3 目前链表中元素为: 1 2 3 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值