1.链表
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
分类:
(1)单链表、双向链表
(2)不带头单链表、带头链表
(3)单链表、循环单链表
(4)无头单相非循环链表、带头双向循环链表
2.带头节点和不带头节点的区别
带头节点和不带头节点的区别体现在清空和销毁上,不带头节点链表中,请空链表和销毁链表作用相同,而带头节点链表的清空是清空除头节点以外的所有节点,销毁则是将头节点在内的所有节点清空。
3.单链表程序
(1)链表的节点
//链表的节点
typedef struct SListNode
{
SDataType _data;
struct SListNode* _pNext;
}Node,*PNode;
(2)链表结构
typedef struct SList
{
PNode _pHead;//指向链表中的第一个节点
}SList;
(3)初始化
void SListInit(SList* s)
{
assert(s);
s->_pHead = NULL;
}
(4)创建节点
PNode BuySListNode(SDataType data)
{
PNode pNewNode = (PNode)malloc(sizeof(Node));
if (NULL == pNewNode)
{
assert(0);
return NULL;
}
pNewNode->_data = data;
pNewNode->_pNext = NULL;
return pNewNode;
}
(5)尾插
void SListPushBack(SList* s, SDataType data)
{
assert(s);
PNode pNewNode = BuySListNode(data);
if (NULL == s->_pHead)//空链表
{
s->_pHead = pNewNode;
}
else//链表非空
{
//找链表中最后一个节点
PNode pCur = s->_pHead;
while (NULL != pCur->_pNext)
{
pCur = pCur->_pNext;
}
pCur->_pNext = pNewNode;
}
}
(6)尾删
void SListPopBack(SList* s)
{
assert(s);
if (s->_pHead == NULL)//空链表
{
return;
}
else if (s->_pHead->_pNext ==NULL)//链表只有一个节点
{
free(s->_pHead);
s->_pHead = NULL;
}
else//链表有多个节点
{
PNode pPre = NULL;
PNode pCur = s->_pHead;
while (pCur->_pNext)
{
pPre = pCur;
pCur = pCur->_pNext;
}
free(pCur);
pPre->_pNext = NULL;
}
}
(7)头插
void SListPushFront(SList* s, SDataType data)
{
assert(s);
PNode pNewNode = BuySListNode(data);
pNewNode->_pNext = s->_pHead;
s->_pHead = pNewNode;
}
(8)头删
void SListPopFront(SList* s)
{
assert(s);
if (s->_pHead == NULL)
{
return;
}
else
{
PNode pDelNode = s->_pHead;
s->_pHead = pDelNode->_pNext;
free(pDelNode);
}
}
(9)任意位置插入
void SListInsert(PNode pos, SDataType data)
{
if (pos == NULL)
{
return;
}
else
{
PNode pNewNode = BuySListNode(data);
pNewNode->_pNext = pos->_pNext;
pos->_pNext = pNewNode;
}
}
(10)任意位置删除
void SListErase(SList* s, PNode pos)
{
assert(s);
if (pos == NULL || s->_pHead == NULL)
{
return;
}
else if(s->_pHead==pos)
{
s->_pHead = pos->_pNext;
}
else
{
PNode pPrePos = s->_pHead;;
while (pPrePos && pPrePos->_pNext != pos)
{
pPrePos = pPrePos->_pNext;
}
if (pPrePos)
{
pPrePos->_pNext = pos->_pNext;
}
}
free(pos);
}
(11)查找
PNode SListFind(SList* s, SDataType data)
{
assert(s);
PNode pCur = s->_pHead;
while (pCur)
{
if (pCur->_data == data)
{
return pCur;
}
else
{
pCur = pCur->_pNext;
}
}
return NULL;
}
(12)节点个数
size_t SListSize(SList* s)
{
assert(s);
PNode pCur = s->_pHead;
size_t count = 0;
while (pCur)
{
count++;
pCur = pCur->_pNext;
}
return count;
}
(13)判空
int SListEmpty(SList* s)
{
assert(s);
if (s->_pHead == NULL)
{
return;
}
}
(14)清空
void SListClear(SList* s)
{
assert(s);
if (s->_pHead == NULL)
{
return;
}
s->_pHead->_pNext = NULL;
}
(15)销毁
void SListDestroy(SList* s)
{
s->_pHead = NULL;
}
链表代码
头文件
#pragma once
typedef int SDataType;
//链表的节点
typedef struct SListNode
{
SDataType _data;
struct SListNode* _pNext;
}Node,*PNode;
typedef struct SList
{
PNode _pHead;//指向链表中的第一个节点
}SList;
void SListInit(SList* s);
void SListPushBack(SList* s, SDataType data);
void SListPopBack(SList* s);
void SListPushFront(SList* s, SDataType data);
void SListPopFront(SList* s);
void SListInsert(PNode pos, SDataType data);
void SListErase(SList* s,PNode pos);
PNode SListFind(SList* s, SDataType data);
int SListSize(SList* s);
int SListEmpty(SList* s);
void SListClear(SList* s);
void SListDestroy(SList* s);
void TestSList();
源文件
#include"SList.h"
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
void SListInit(SList* s)
{
assert(s);
s->_pHead = NULL;
}
PNode BuySListNode(SDataType data)
{
PNode pNewNode = (PNode)malloc(sizeof(Node));
if (NULL == pNewNode)
{
assert(0);
return NULL;
}
pNewNode->_data = data;
pNewNode->_pNext = NULL;
return pNewNode;
}
void SListPushBack(SList* s, SDataType data)
{
assert(s);
PNode pNewNode = BuySListNode(data);
if (NULL == s->_pHead)//空链表
{
s->_pHead = pNewNode;
}
else//链表非空
{
//找链表中最后一个节点
PNode pCur = s->_pHead;
while (NULL != pCur->_pNext)
{
pCur = pCur->_pNext;
}
pCur->_pNext = pNewNode;
}
}
void SListPopBack(SList* s)
{
assert(s);
if (s->_pHead == NULL)//空链表
{
return;
}
else if (s->_pHead->_pNext ==NULL)//链表只有一个节点
{
free(s->_pHead);
s->_pHead = NULL;
}
else//链表有多个节点
{
PNode pPre = NULL;
PNode pCur = s->_pHead;
while (pCur->_pNext)
{
pPre = pCur;
pCur = pCur->_pNext;
}
free(pCur);
pPre->_pNext = NULL;
}
}
void SListPushFront(SList* s, SDataType data)
{
assert(s);
PNode pNewNode = BuySListNode(data);
pNewNode->_pNext = s->_pHead;
s->_pHead = pNewNode;
}
void SListPopFront(SList* s)
{
assert(s);
if (s->_pHead == NULL)
{
return;
}
else
{
PNode pDelNode = s->_pHead;
s->_pHead = pDelNode->_pNext;
free(pDelNode);
}
}
void SListInsert(PNode pos, SDataType data)
{
if (pos == NULL)
{
return;
}
else
{
PNode pNewNode = BuySListNode(data);
pNewNode->_pNext = pos->_pNext;
pos->_pNext = pNewNode;
}
}
void SListErase(SList* s, PNode pos)
{
assert(s);
if (pos == NULL || s->_pHead == NULL)
{
return;
}
else if(s->_pHead==pos)
{
s->_pHead = pos->_pNext;
}
else
{
PNode pPrePos = s->_pHead;;
while (pPrePos && pPrePos->_pNext != pos)
{
pPrePos = pPrePos->_pNext;
}
if (pPrePos)
{
pPrePos->_pNext = pos->_pNext;
}
}
free(pos);
}
PNode SListFind(SList* s, SDataType data)
{
assert(s);
PNode pCur = s->_pHead;
while (pCur)
{
if (pCur->_data == data)
{
return pCur;
}
else
{
pCur = pCur->_pNext;
}
}
return NULL;
}
int SListSize(SList* s)
{
assert(s);
PNode pCur = s->_pHead;
size_t count = 0;
while (pCur)
{
count++;
pCur = pCur->_pNext;
}
printf("size=%d", count);
printf("\n");
return count;
}int SListEmpty(SList* s)
{
assert(s);
if (s->_pHead == NULL)
{
return;
}
}void SListClear(SList* s)
{
assert(s);
if (s->_pHead == NULL)
{
return;
}
s->_pHead->_pNext = NULL;
}void SListDestroy(SList* s)
{
s->_pHead = NULL;
}
void PrintSList(SList* s)
{
assert(s);
PNode pCur = s->_pHead;
while (pCur)
{
printf("%d--->", pCur->_data);
pCur = pCur->_pNext;
}
printf("NULL\n");
}
void TestSList1()
{
SList s;
SListInit(&s);
SListPushBack(&s, 1);
SListPushBack(&s, 2);
SListPushBack(&s, 3);
SListPushBack(&s, 4);
SListPushBack(&s, 5);
PrintSList(&s);
SListPopBack(&s);
SListPopBack(&s);
SListPopBack(&s);
SListPopBack(&s);
SListPopBack(&s);
SListPopBack(&s);
PrintSList(&s);
}
void TestSList2()
{
SList s;
SListInit(&s);
SListPushFront(&s, 1);
SListPushFront(&s, 2);
SListPushFront(&s, 3);
SListPushFront(&s, 4);
SListPushFront(&s, 5);
PrintSList(&s);
SListSize(&s);
SListPopFront(&s);
PrintSList(&s);
SListPopFront(&s);
SListPopFront(&s);
SListPopFront(&s);
SListPopFront(&s);
SListPopFront(&s);
SListPopFront(&s);
PrintSList(&s);
SListDestroy(&s);
PrintSList(&s);
}
void TestSList()
{
TestSList1();
TestSList2();
}
#include"SList.h"
int main()
{
TestSList();
return 0;
}