目录
1,单链表的定义
2,单链表的实现
A,函数的声明
B,函数的定义
1,单链表的定义
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。
链表一般可以分为:
1,无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。
2,带头双向循环链表:结构复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向链表。
2,单链表的实现
A,函数的声明
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef int SLDataType; //数据类型
typedef struct SListNode//单向链表
{SLDataType data; //存储数据struct SListNode* next; //下节点地址
}SLTNode;//遍历链表/创建节点/尾插/头插/尾删/头删
void SListPrint(SLTNode* phead);
SLTNode* BuySListNode(SLDataType x);
void SListPushBack(SLTNode** pphead, SLDataType x);
void SListPushFront(SLTNode** pphead, SLDataType x);
void SListPopBack(SLTNode** pphead);
void SListPopFront(SLTNode** pphead);// 按值查找/在pos位置之前插入节点/删除pos位置的节点
SLTNode* SListFind(SLTNode* phead, SLDataType x);
void SListPosInsert(SLTNode** pphead, SLTNode* pos, SLDataType x);
void SListPosErase(SLTNode** pphead, SLTNode* pos);
B,函数的定义
void SListPrint(SLTNode* phead)
{SLTNode* cur = phead;while (cur != NULL){printf("%d->",cur->data);cur = cur->next;}printf("NULL\n");
}SLTNode* BuySListNode(SLDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));assert(newnode);newnode->data = x;newnode->next = NULL;return newnode;
}void SListPushBack(SLTNode** pphead, SLDataType x)
{//建立新节点SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));assert(newnode);newnode->data = x;newnode->next = NULL;//链表为空的情况if (*pphead == NULL){*pphead = newnode;}else{//找尾节点SLTNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}//建立连接tail->next = newnode;}
}void SListPushFront(SLTNode** pphead, SLDataType x)
{SLTNode* newnode = BuySListNode(x);newnode->next = *pphead;*pphead = newnode;
}void SListPopBack(SLTNode** pphead)
{//链表为空的情况assert(*pphead != NULL);//只有一个节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{//多个节点SLTNode* tail = *pphead;while (tail->next->next != NULL){tail = tail->next;}free(tail->next);tail->next = NULL;}
}void SListPopFront(SLTNode** pphead)
{assert(*pphead != NULL);SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;
}SLTNode* SListFind(SLTNode* phead, SLDataType x)
{SLTNode* cur = phead;while(cur){if (cur->data == x)return cur;cur = cur->next;}return 0;
}void SListPosInsert(SLTNode** pphead, SLTNode* pos, SLDataType x)
{assert(*pphead);assert(pos);SLTNode* newnode = BuySListNode(x);//头插if (*pphead == pos){newnode->next = *pphead;*pphead = newnode;}else{//找posSLTNode* cur = *pphead;while (cur->next != pos){cur = cur->next;}cur->next = newnode;newnode->next = pos;}
}void SListPosErase(SLTNode** pphead, SLTNode* pos)
{assert(*pphead);assert(pos);//头删if (*pphead == pos){SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;}else{SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);}
}