数据结构 链表 C语言实现
先将代码分享出来,后续更新使用说明
链表难度大于队列,使用的双重指针实现,对C语言基础要求稍微高一点。
/**
* 文件名: ulist.c
* 说明: 链表实现源文件
* 作者: HAUE.Y2C
*/
#include "ulist.h"
//链表初始化
SListNode ** SListInit(void)
{
SListNode **ppFirst;
ppFirst = (SListNode**)malloc(sizeof(SListNode*));
*ppFirst = NULL;
return ppFirst;
}
//申请新节点
static SListNode* CreateNode(DataType stdata)
{
SListNode*node = (SListNode*)malloc(sizeof(SListNode));
if( node != NULL)
{
//为结构体内的pData数据指针申请内存空间和进行数据存储,使用长度复制,不使用字符串长度复制
unsigned char *pTempData = malloc(stdata.dataLen);
memcpy((char *)pTempData, (char *)stdata.pData, stdata.dataLen);
node->data.dataLen = stdata.dataLen;
node->data.pData = pTempData;
node->next = NULL;
}
return node;
}
//尾部插入
void SListPushBack(SListNode** ppFirst, DataType stdata)
{
SListNode *node = CreateNode(stdata);
if (*ppFirst == NULL) //空链表
{
*ppFirst = node;
return;
}
else //非空链表,寻找链表中的最后一个节点
{
SListNode* cur = *ppFirst;
while (cur->next != NULL)
{
cur = cur->next;
}
cur->next = node;//插入新申请的节点
}
}
//头部插入
void SListPushFront(SListNode **ppFirst, DataType stdata)
{
SListNode *node = CreateNode(stdata);
node->next = *ppFirst;
*ppFirst = node;
}
//尾部删除
void SListPopBack(SListNode **ppFirst)
{
if(*ppFirst == NULL) //空链表退出
{
return;
}
else //非空链表,进行删除操作
{
SListNode*cur = *ppFirst;
while (cur->next != NULL) //寻找链表中的最后一个节点
{
cur = cur->next;
}
free(cur->data.pData);
free(cur->next);
cur->next = NULL;
if ((*ppFirst)->next == NULL) //最后一个节点,清空链表
{
*ppFirst = NULL;
}
}
}
//头部删除
void SListPopFront(SListNode **ppFirst)
{
if(*ppFirst == NULL) //空链表退出
{
return;
}
else //非空链表,进行删除操作
{
SListNode *first = *ppFirst;
*ppFirst = (*ppFirst)->next;
free(first->data.pData);
free(first);
}
}
/**
* 文件名: ulist.h
* 说明: 链表实现头文件
* 作者: HAUE.Y2C
*/
#ifndef __ULIST_H
#define __ULIST_H
#include "sys.h"
#include "main.h"
typedef struct
{
unsigned char dataLen; //数据长度
unsigned char *pData; //数据指针
}DataType;
typedef struct SListNode
{
DataType data; // 值
struct SListNode *next; // 指向下一个结点
}SListNode;
//初始化 ,构造一条空的链表
SListNode ** SListInit(void);
//尾部插入
void SListPushBack(SListNode** ppFirst, DataType data);
//头部插入
void SListPushFront(SListNode **ppFirst, DataType data);
//尾部删除
void SListPopBack(SListNode **ppFirst);
//头部删除
void SListPopFront(SListNode **ppFirst);
#endif
其他
如果有用请点赞,谢谢!!!