无头单链表基本操作的实现
2018-03-27 17:42
316 查看
首先. 看一下我们要实现的基本功能;,实现以下链表的基本操作
typedef int DataType;
typedef struct Node
{
struct Node* _pNext;
DataType _data;
}Node, *PNode;
//////////////////不带头结点的单链表//////////////////////////////////////
// .h
// 链表初始化
void SListInit(PNode* pHead);
// 尾插
void SListPushBack(PNode* pHead, DataType data);
// 尾删
void SListPopBack(PNode* pHead);
// 头插
void SListPushFront(PNode* pHead, DataType data);
// 头删
void SListPopFront(PNode* pHead);
// 查找值为data的结点,返回该结点在链表中的位置
PNode SListFind(PNode pHead, DataType data);
// 在链表pos位置后插入结点data
void SListInsert(PNode* pHead, PNode pos, DataType data);
// 删除链表pos位置上的结点
void SListErase(PNode* pHead, PNode pos);
// 销毁单链表
void SListDestroy(PNode* pHead);
// 求链表中结点的个数
int SListSize(PNode pHead);
// 将链表中的结点清空
void SListClear(PNode* pHead);
// 获取结点
PNode BuySListNode(DataType data);
// 获取链表中的最后一个结点,返回该结点的地址
PNode SListBack(PNode pHead);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////然后在.h中声明要实现的功能:看代码:
#include<assert.h>
#include<stdio.h>
typedef int DataType;
typedef struct Node
{
struct Node* _pNext;
DataType _data;
}Node, *PNode;
//////////////////不带头结点的单链表//////////////////////////////////////
// .h
// 链表初始化
void SListInit(PNode* ppHead);
//新节点的申请
PNode NewNode(DataType data);
// 尾插
void SListPushBack(PNode* ppHead, DataType data);
// 尾删
void SListPopBack(PNode* ppHead);
// 头插
void SListPushFront(PNode* ppHead, DataType data);
// 头删
void SListPopFront(PNode* ppHead);
// 查找值为data的结点,返回该结点在链表中的位置
PNode SListFind(PNode pHead, DataType data);
// 在链表pos位置后插入结点data
void SListInsert(PNode* ppHead, PNode pos, DataType data);
// 删除链表pos位置上的结点
void SListErase(PNode* ppHead, PNode pos);
// 销毁单链表
void SListDestroy(PNode* ppHead);
// 求链表中结点的个数
int SListSize(PNode pHead);
// 将链表中的结点清空
void SListClear(PNode* ppHead);
// 获取结点
PNode BuySListNode(DataType data);
// 获取链表中的最后一个结点,返回该结点的地址
PNode SListBack(PNode pHead);
然后在.c文件中来实现这波功能:
然后,就可以写一个test.c文件来测这波功能啦(可以开个监视窗口来检测一下是否正确
typedef int DataType;
typedef struct Node
{
struct Node* _pNext;
DataType _data;
}Node, *PNode;
//////////////////不带头结点的单链表//////////////////////////////////////
// .h
// 链表初始化
void SListInit(PNode* pHead);
// 尾插
void SListPushBack(PNode* pHead, DataType data);
// 尾删
void SListPopBack(PNode* pHead);
// 头插
void SListPushFront(PNode* pHead, DataType data);
// 头删
void SListPopFront(PNode* pHead);
// 查找值为data的结点,返回该结点在链表中的位置
PNode SListFind(PNode pHead, DataType data);
// 在链表pos位置后插入结点data
void SListInsert(PNode* pHead, PNode pos, DataType data);
// 删除链表pos位置上的结点
void SListErase(PNode* pHead, PNode pos);
// 销毁单链表
void SListDestroy(PNode* pHead);
// 求链表中结点的个数
int SListSize(PNode pHead);
// 将链表中的结点清空
void SListClear(PNode* pHead);
// 获取结点
PNode BuySListNode(DataType data);
// 获取链表中的最后一个结点,返回该结点的地址
PNode SListBack(PNode pHead);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////然后在.h中声明要实现的功能:看代码:
#include<assert.h>
#include<stdio.h>
typedef int DataType;
typedef struct Node
{
struct Node* _pNext;
DataType _data;
}Node, *PNode;
//////////////////不带头结点的单链表//////////////////////////////////////
// .h
// 链表初始化
void SListInit(PNode* ppHead);
//新节点的申请
PNode NewNode(DataType data);
// 尾插
void SListPushBack(PNode* ppHead, DataType data);
// 尾删
void SListPopBack(PNode* ppHead);
// 头插
void SListPushFront(PNode* ppHead, DataType data);
// 头删
void SListPopFront(PNode* ppHead);
// 查找值为data的结点,返回该结点在链表中的位置
PNode SListFind(PNode pHead, DataType data);
// 在链表pos位置后插入结点data
void SListInsert(PNode* ppHead, PNode pos, DataType data);
// 删除链表pos位置上的结点
void SListErase(PNode* ppHead, PNode pos);
// 销毁单链表
void SListDestroy(PNode* ppHead);
// 求链表中结点的个数
int SListSize(PNode pHead);
// 将链表中的结点清空
void SListClear(PNode* ppHead);
// 获取结点
PNode BuySListNode(DataType data);
// 获取链表中的最后一个结点,返回该结点的地址
PNode SListBack(PNode pHead);
然后在.c文件中来实现这波功能:
#define _CRT_SECURE_NO_WARNINGS #include "标头.h"; void SListInit(PNode* ppHead){// 链表初始化 assert(ppHead); *ppHead = NULL; } //新节点的申请 PNode NewNode(DataType data){ PNode PNewnode = (PNode)malloc(sizeof(Node)); if (NULL == PNewnode){ return NULL; } PNewnode->_pNext = NULL; PNewnode->_data = data; return PNewnode; } // 尾插 void SListPushBack(PNode* ppHead, DataType data){ assert(ppHead); PNode pnewnode = NULL; pnewnode = NewNode(data); if (NULL == pnewnode){ return NULL; } if (NULL == *ppHead){ *ppHead = pnewnode; } else{ PNode pcurnode = *ppHead; while (pcurnode->_pNext != NULL){ pcurnode = pcurnode->_pNext; } pcurnode->_pNext = pnewnode; } } // 尾删 void SListPopBack(PNode* ppHead){ assert(ppHead); if (NULL == *ppHead){ return NULL; } else if ((*ppHead)->_pNext == NULL) { free(*ppHead); *ppHead = NULL; } else{ PNode pcurnode = *ppHead; while (NULL != pcurnode->_pNext->_pNext){ pcurnode = pcurnode->_pNext; } free(pcurnode->_pNext); pcurnode = NULL; } } // 头插 void SListPushFront(PNode* ppHead, DataType data){ assert(ppHead); PNode pnewnode = NULL; pnewnode = NewNode(data); if (NULL == pnewnode){ return NULL; } pnewnode->_pNext = *ppHead; *ppHead = pnewnode; } // 头删 void SListPopFront(PNode* ppHead){ assert(ppHead); if (NULL == *ppHead){ return NULL; } else{ DataType deldata = *ppHead; *ppHead = (*ppHead)->_pNext; free(deldata); } } // 查找值为data的结点,返回该结点在链表中的位置 PNode SListFind(PNode pHead, DataType data){ if (NULL == pHead){ return NULL; } PNode pcurnode = NULL; while (pcurnode!=NULL) { if (pcurnode->_data == data) { return pcurnode; } } return NULL; } // 在链表pos位置后插入结点data void SListInsert(PNode* ppHead, PNode pos, DataType data){ assert(ppHead); if (*ppHead == NULL || pos == NULL) { return; } PNode pnewnode = NULL; pnewnode = NewNode(data); if (NULL == pnewnode){ return NULL; } pnewnode->_pNext = pos->_pNext; pos->_pNext = pnewnode; } // 删除链表pos位置上的结点 void SListErase(PNode* ppHead, PNode pos){ assert(ppHead); if (*ppHead == NULL || pos == NULL) { return; } if (pos == *ppHead){ SListPopFront(ppHead); } else{ PNode pcurnode = *ppHead; while (pcurnode->_pNext != pos){ pcurnode = pcurnode->_pNext; } pcurnode->_pNext = pos->_pNext; free(pos); } } // 销毁单链表 void SListDestroy(PNode* ppHead){ PNode pdelnode = NULL; assert(ppHead); while (*ppHead){ pdelnode = *ppHead; *ppHead = (*ppHead)->_pNext; free(pdelnode); } } // 求链表中结点的个数 int SListSize(PNode pHead){ PNode pcurnode = pHead; int count = 0; while(pcurnode){ count++; pcurnode = pcurnode->_pNext; } return count; } // 将链表中的结点清空 void SListClear(PNode* ppHead){ SListDestroy(ppHead); }
然后,就可以写一个test.c文件来测这波功能啦(可以开个监视窗口来检测一下是否正确
相关文章推荐
- C语言实现,无头结点不带环的单向链表的基本操作
- 实现无头结点单链表的基本操作函数
- C语言实现无头链表的基本操作
- 链表的基本操作实现
- 链表的基本操作实现
- 双向链表的基本操作实现
- 双向链表的C语言实现与基本操作(二)
- 链表基本操作的实现
- 链表的基本操作(c实现)
- 单链表及其基本操作(C语言实现)
- C++ 实现链表的基本操作之一:链表插入
- C语言实现双向非循环链表(带头结点尾结点)的基本操作
- 单链表基本操作的实现
- 单链表的基本操作(C语言实现)
- 双向链表的C语言实现与基本操作(一)
- C语言 链表的基本操作实现 源码
- C语言实现单链表的基本操作
- c++实现链表的基本操作
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 实验2.3 运用双链表实现对数据的基本操作