C语言单链表

目录

始 

打印 

开辟节点

尾插 

头插

尾删

头删

 查找

指定位置前插入节点

指定位置后插入

指定位置删除 

删除pos之后的节点

销毁


始 

特征:物理结构不一定连续,逻辑结构一定连续物理结构:地址不是连续的,

逻辑结构:通过某几个地址能够找到一些参数,并把连接起来。

这些玩意儿叫节点(多半是结构体类型), 节点里面会放一些数据,以及 下一个节点的地址

节点:分为两部分,数据(可以放很多也可以很少,具体看需求)以及下一个节点的地址 

打印 

        首先,创建一个结构体类型的指针,赋值为NULL(表示为空链表),在插入几个数据之后打印。

        我们直接传递的是这个变量,这个变量里面存的是地址,由于我们不需要修改实参的数据,所以可以直接使用变量访问。

        创建一个临时变量存放p里面的地址,用 cp 访问,每次进来打印里面的数据 a ,再将下一位的地址赋给 p ,上来判断是否为 NULL

也可以不用创建临时变量不会影响实参的。


void SLNprint(SLN* p)//打印链表里的数据
{
	assert(p);
	
	while (p)
	{
		printf("%d->", p->a);
		p = p->Next;
	}
}

开辟节点

用malloc开辟一个节点的空间,判断是否为空,最后是返回开辟成功的地址

SLN* SLNinvent(void)
{
	SLN* iplist = (SLN*)malloc(sizeof(SLN));
	if (iplist == NULL)
	{
		perror("malloc");
		exit(EOF);
	}
	return iplist;

}

尾插 

大致可以把尾插分两部分开辟节点,和找到尾部

开辟节点后给节点赋值上你要插入的值,将下个节点的指针置NULL

第二部分:

        创建一个临时节点变量,用来存放头结点的的地址

        判断头链表是否是空链表(人话:头结点是否是空指针)

        else遍历链表,直到遇见某个节点的 Next 是NULL,此时的slntail 变量放的是最后一个节点的地址(一个结构体空间的起始地址)。再将这个节点里面的Next 赋值为刚刚开辟的节点地址。

void SLNpushback(SLN** phead,int a)
{
	assert(phead);
	
	SLN* list = SLNinvent();
	list->a = a;
	list->Next = NULL;
	
	
	SLN* slntail = *phead;
	
	if (*phead == NULL)
### C语言单链表的实现与操作 #### 基本概念 在C语言中,单链表是一种动态数据结构,由一系列节点组成。每个节点包含两部分:一部分用于存储数据,另一部分是一个指向下一个节点的指针。 为了便于操作,通常会引入头结点的概念[^2]。头结点不存储实际的数据,仅作为辅助节点存在,可以简化边界条件处理。 #### 头文件的引入 使用单链表时,需包含必要的头文件以支持内存分配和字符串操作等功能: ```c #include "stdio.h" #include "stdlib.h" // 提供 malloc() 和 free() #include "string.h" // 提供 strcpy() 等函数 ``` 这些头文件提供了创建、初始化以及销毁链表所需的工具[^1]。 #### 节点定义 单链表的核心在于其节点的设计。以下是典型的节点定义方式: ```c typedef struct LNode { int data; // 数据域 struct LNode *next; // 指向下一节点的指针 } LNode, *LinkList; ``` 这里 `LNode` 定义了一个节点类型,而 `LinkList` 是指向该类型的指针变量。 #### 创建单链表 可以通过多种方法来构建单链表,常见的有 **尾插法** 和 **头插法**: ##### 尾插法 尾插法是从链表头部开始逐步插入新节点到链表末尾的方式。 ```c void CreateList_Tail(LinkList &L, int n) { LinkList p, r = L; // 初始化工作指针r为头结点 for(int i=0;i<n;i++) { p = (LinkList)malloc(sizeof(LNode)); scanf("%d", &(p->data)); // 输入数据 p->next = NULL; r->next = p; // 插入到最后一个节点之后 r = p; // 更新最后一个节点位置 } } ``` ##### 头插法 头插法则是在每次插入时都将新节点放置于当前链表的第一个有效节点之前。 ```c void CreateList_Head(LinkList &L, int n){ LinkList p; for(int i=0;i<n;i++){ p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&(p->data)); // 输入数据 p->next=L->next; // 新节点连接至原首节点前 L->next=p; // 修改头结点指向新的第一个节点 } } ``` #### 查找操作 对于按位查找的功能,在已知索引的情况下可以直接遍历链表找到对应位置上的元素[^3]。时间复杂度一般为 O(n),其中 n 代表链表长度。 ```c int GetElem(LinkList L, int index){ if(index<0 || !L->next)return -1; // 判断输入合法性 LinkList p = L->next; while(p && --index>0)p=p->next; return p?p->data:-1; } ``` #### 删除操作 删除指定位置处的节点需要先定位目标节点及其前置节点,随后调整指针关系完成移除过程。 ```c bool DeleteElem(LinkList &L,int pos){ if(pos<=0||!L->next)return false; LinkList pre=L,p=L->next; for(int i=1;p&&i<pos;i++,pre=p,p=p->next); if(!p)return false; pre->next=p->next; free(p);return true; } ``` #### 存储应用实例——学生信息管理 利用上述基础功能可进一步扩展应用于具体场景下,比如建立一个简单的学生信息系统[^4]: ```c struct Student{ char name[20]; int score; struct Student *next; }; // 添加学生记录... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值