使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。这篇推文主要介绍单链表的相关知识,需要有一定的理论基础。
#include "stdio.h"
#include "stdlib.h"
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
//创建节点(结构体)
struct Linked
{
int data; //数据域
//因为指向的是结构体,所以定义了一个结构体指针
struct Linked *next; //指针域(指向下一节点的指针)
};
//创建链表
struct Linked *Found(uint8_t num)
{
printf("请输入%d个数据\n",num);
//局部变量
uint8_t i = 0;
//定义头节点,普通节点,尾部节点
struct Linked *head, *node, *end;
//创建头节点
head = (struct Linked*)malloc(sizeof(struct Linked));
//空链表头尾节点一致
end = head;
//新增节点
for ( i=0; i<num; i++ )
{
//创建普通节点
node = (struct Linked*)malloc(sizeof(struct Linked));
//输入数据
scanf("%d",&node->data);
//链接普通节点
end->next = node;
//更新尾节点
end = node;
}
//结束创建
end->next = NULL;
//返回头节点
return head;
}
//打印链表
void DirData( struct Linked *pHead )
{
//节点缓存
struct Linked *pTemp = pHead;
//指向第一个数据
pTemp = pTemp->next;
while( pTemp != NULL )
{
printf("%d\n",pTemp->data);
//更新节点
pTemp = pTemp->next;
}
}
//打印特定链表值
void DirSelectData( struct Linked *pHead,uint8_t select)
{
//节点缓存
struct Linked *pTemp = pHead;
//局部变量
uint8_t i = 0;
//扫描数据
while( i < select && pTemp != NULL)
{
pTemp = pTemp->next;
i++;
}
if( pTemp != NULL )
{
printf("您获取的数据为\n");
printf("%d\n",pTemp->data);
}
else
{
printf("节点不存在\n");
}
}
//在特定位置添加节点
void AddSelectData( struct Linked *pHead,uint8_t select)
{
//节点缓存
struct Linked *pTemp = pHead;
//定义新节点缓存
struct Linked *pNode;
//局部变量
uint8_t i = 0;
//扫描数据
while( i < select-1 && pTemp != NULL)
{
pTemp = pTemp->next;
i++;
}
if( pTemp != NULL )
{
//创建普通节点
pNode = (struct Linked*)malloc(sizeof(struct Linked));
printf("请输入数据\n");
scanf("%d",&pNode->data);
/*注意下面两句语句循序*/
//pTemp节点的下一节点链接到新节点的下一节点
pNode->next = pTemp->next;
//将新节点链接到pTemp节点的下一节点
pTemp->next = pNode;
}
else
{
printf("节点不存在\n");
}
}
//在特定位置删除节点
void DelSelectData( struct Linked *pHead,uint8_t select)
{
//节点缓存
struct Linked *pTemp = pHead;
struct Linked *pSaver;
//局部变量
uint8_t i = 0;
//扫描数据
while( i < select && pTemp != NULL)
{
//保持节点
pSaver = pTemp;
//更新节点
pTemp = pTemp->next;
i++;
}
if( pTemp != NULL )
{
//注意pSaver是pTemp的上一个节点
pSaver->next = pTemp->next;
//释放普通节点
free( pTemp );
}
else
{
printf("节点不存在\n");
}
}
void main(void)
{
struct Linked *phead = NULL;
phead = Found(5);
printf("扫描数据 \n");
DirData( phead );
DirSelectData( phead, 1 );
AddSelectData( phead, 1 );
printf("扫描数据 \n");
DirData( phead );
DelSelectData( phead, 1 );
printf("扫描数据 \n");
DirData( phead );
}
–END–
转载请注明:XAMPP中文组官网 » C语言|单链表