> 文档中心 > 数据结构之单链表的实现(含全部代码)

数据结构之单链表的实现(含全部代码)


单链表的实现

首先创建头文件

#pragma#include#include#include
//定义数据类型typedef int SLDataType;//创建单链表typedef struct SLinkListNode{SLDataType data;struct SLinkListNode* next;}SLNode;

以下是所需要实现的函数接口

//不会改变头指针,传一级指针//可能改变头指针,传二级指针// //创建结点SLNode* BuySLNode(SLDataType x);//打印void SListPrint(SLNode* phead);//尾插void SListPushBack(SLNode** pphead, SLDataType x);//头插void SListPushFront(SLNode** pphead, SLDataType x);//尾删void SListPopBack(SLNode** pphead);//头删void SListPopFront(SLNode** pphead);//在pos前插入xvoid SListInsert(SLNode** pphead, SLNode* pos, SLDataType x);//找到x的位置并返回SLNode* SListFind(SLNode* phead, SLDataType x);//删除pos位置的值void SListErase(SLNode** pphead, SLNode* pos);

接下来是函数的实现

#include"SLinkList.h"//创建新结点SLNode* BuySLNode(SLDataType x){SLNode* newnode = (SLDataType*)malloc(sizeof(SLDataType));if (newnode == NULL){printf("malloc fail\n");exit(-1);}newnode->data = x;newnode->next = NULL;return newnode;}//打印void SListPrint(SLNode* phead){SLNode* cur = phead;while (cur != NULL){printf("%d->", cur->data);cur = cur->next;}printf("NULL\n");}//尾插void SListPushBack(SLNode** pphead, SLDataType x){SLNode* newnode = BuySLNode(x);if (*pphead == NULL){*pphead = newnode;}else{// 找尾节点的指针SLNode* tail = *pphead;while (tail->next){tail = tail->next;}// 尾节点,链接新节点tail->next = newnode;}}//头插void SListPushFront(SLNode** pphead, SLDataType x){SLNode* newnode = BuySLNode(x);newnode->next = *pphead;*pphead = newnode;}//尾删void SListPopBack(SLNode** pphead){if (*pphead == NULL){return;}else if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLNode* prev = NULL;SLNode* tail = *pphead;while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);tail = NULL;prev->next = NULL;}}//头删void SListPopFront(SLNode** pphead){SLNode* next = (*pphead)->next;free(*pphead);*pphead = next;}//在pos前插入xvoid SListInsert(SLNode** pphead, SLNode* pos, SLDataType x){if (pos == *pphead){SListPushFront(pphead, x);}else{SLNode* newnode = BuySLNode(x);SLNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = newnode;newnode->next = pos;}}//找到x的位置并返回SLNode* SListFind(SLNode* phead, SLDataType x){SLNode* cur = phead;while (cur != NULL){if (cur->data == x){return cur;}cur = cur->next;}return NULL;}//删除pos位置的值void SListErase(SLNode** pphead, SLNode* pos){if (pos == *pphead){SListPopFront(pphead);}else{SLNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;}}