链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。 单链表(单向链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始,如下图所示。
本文将结合代码详解C语言链表,单向链表的数据结构可以分为两部分:数据域和指针域,数据域存储数据,指针域指向下一个储存节点的地址,C语言详细代码及注释如下。
源码展示:
#include <stdio.h>
//节点类型
struct Node{
int n; //数据
struct Node* pNext; //连接
};
//创建节点
struct Node* CreateNode(int n);
//增加节点
//头插法 新增节点 是第一个节点 把哪个节点插入到哪个链表中
void insertToHead(int n, struct Node** list);
//尾插法 新增节点 是最后一个节点
void insertToTail(int n, struct Node** list);
//中间插入 新增节点 是第N个节点
void insertToNum(int n, struct Node** list,int num);
//找链表中第num个节点,找到返回其地址,找不到返回NULL
struct Node* findPos(struct Node* list, int num);
//遍历
void travel(struct Node* list);
int main(){
//pList是个链表
struct Node* pList = NULL;
travel(pList);
for (int i = 1; i < 10; i++){
insertToHead(i, &pList);
}
travel(pList);
struct Node* pTemp = findPos(pList, 1);
if (pTemp){
printf("找到了:%d\n", pTemp->n);
}
else{
printf("没找到!\n");
}
while (1);
return 0;
}
//创建节点
struct Node* CreateNode(int n){
//1 申请内存
struct Node* pNew = (struct Node*)malloc(sizeof(struct Node));
if (NULL == pNew){
printf("申请内存失败!\n");
return NULL;
}
//2 成员赋值
pNew->n = n;
pNew->pNext = NULL;//空指针 没有赋值 野指针
//3 返回
return pNew;
}
//头插法 新增节点 是第一个节点 把哪个节点插入到哪个链表中
void insertToHead(int n, struct Node** list){
if (NULL == *list){//是否空链表
*list = CreateNode(n);
}
else{
struct Node* pNew = CreateNode(n);//创建新节点
//新节点的next指针指向*list指向的节点
pNew->pNext = *list;
//*list指向pNew
*list = pNew;
}
}
//遍历
void travel(struct Node* list){
#if 0
struct Node* pTemp = list;
printf("list:");
while (pTemp){//while (NULL != pTemp){
//if (NULL == pTemp) break;
printf("%d ", pTemp->n);
pTemp = pTemp->pNext;//pTemp指向下一个
}
printf("\n");
#else
printf("list:");
while (list){
printf("%d ", list->n);
list = list->pNext;//pTemp指向下一个
}
printf("\n");
#endif
}
//尾插法 新增节点 是最后一个节点
void insertToTail(int n, struct Node** list){
if (*list){//为空
*list = CreateNode(n);
}
else{//不为空
struct Node* pTemp = *list;//创建临时指针
//让pTemp指向链表尾节点
while (pTemp->pNext){
pTemp = pTemp->pNext;
}
//pTemp的next连接新节点
pTemp->pNext = CreateNode(n);
}
}
//中间插入 新增节点 是第N个节点
void insertToNum(int n, struct Node** list, int num){
//1 先找到第num-1个节点 //如果找不到 尾插法或者头插法随意
//2 找到了 新节点的next指针,指向第num-1个节点的next
//3 新节点成为第num-1个节点 的next
}
//找链表中第num个节点,找到返回其地址,找不到返回NULL
struct Node* findPos(struct Node* list, int num){
int count = 1;
while (1){
if (NULL == list) break;
if (count == num) return list;
list = list->pNext;
count++;
}
return NULL;
}
视频教程:
我有一个编程学习群,里面有各种C/C++项目资料、教程及源码等,欢迎大家一起来学习交流哦~
扫下方二维码即可进入