链表:一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素,称存储单元为一个节点。
单链表
SList.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<Windows.h>
typedef int DataType;
typedef struct DListNode
{
struct DListNode* _next;
DataType _data;
}DListNode;
DListNode* BuyDListNode(DataType x);//创建节点
void DListPrint(DListNode* pHead);//打印链表
void DListErase(DListNode** pHead);//删除链表
void DListPushBack(DListNode** pHead, DataType x);//尾插
void DListPopBack(DListNode** pHead);//尾删
void DListPushFront(DListNode** pHead, DataType x);//头插
void DListPopFront(DListNode** pHead);//头删
DListNode* DListFind(DListNode* pHead, DataType x);//查找指定元素
void DListAt(DListNode** pHead, DListNode* pos, DataType x);//替换指定位置元素
void DListInsert(DListNode** pHead, DListNode* pos, DataType x);//在指定位置插入
void DListErase(DListNode** pHead, DListNode* pos);//删除指定位置元素
SList.c
函数实现:
DListNode* BuyDListNode(DataType x)//创建节点
{
DListNode* newNode = (DListNode*)malloc(sizeof(DListNode));
if (NULL == newNode)
{
printf("create is failure");
return NULL;
}
newNode->_data = x;
newNode->_next = NULL;
return newNode;
}
void DListPrint(DListNode* pHead)//打印链表
{
if (pHead == NULL)
{
printf("DList is empty\n");
}
while (pHead != NULL)
{
printf("%d-", pHead->_data);
pHead = pHead->_next;
}
}
void DListDestory(DListNode** ppHead)//删除链表
{
assert(ppHead != NULL);
DListNode* head = *ppHead;
free(head);
head->_next = NULL;
}
void DListPushBack(DListNode** ppHead, DataType x)//尾插
{
assert(ppHead != NULL);
DListNode*cur = *ppHead;
if (NULL == *ppHead)
{
*ppHead=BuyDListNode(x);
(*ppHead)->_next = NULL;
}
else
{
while (cur->_next != NULL)
{
cur = cur->_next;
}
cur->_next = BuyDListNode(x);
}
}
void DListPopBack(DListNode** ppHead)//尾删
{
assert(ppHead!=NULL);
DListNode* cur = *ppHead;//记录当前节点
DListNode* prev = NULL;//记录当前节点的前一个位置
if (NULL == cur)
{
printf("DList is empty!\n");
}
else if(NULL==cur->_next)//只有一个节点
{
free(cur);
cur = NULL;
}
else//有多个节点
{
while (cur->_next != NULL)
{
prev = cur;
cur = cur->_next;
}
free(cur);
prev->_next = NULL;
}
}
void DListPushFront(DListNode** ppHead, DataType x)//头插
{
assert(ppHead);
if (NULL == *ppHead)
{
*ppHead = BuyDListNode(x);
(*ppHead)->_next = NULL;
}
else
{
DListNode* cur = BuyDListNode(x);
cur->_next = *ppHead;
*ppHead = cur;
}
}
void DListPopFront(DListNode** ppHead)//头删
{
DListNode*cur = *ppHead;
if (cur == NULL)
{
return;
}
else
{
*ppHead = (*ppHead)->_next;
free(cur);
}
}
DListNode* DListFind(DListNode* pHead, DataType x)//查找指定元素
{
DListNode*cur = pHead;
while (cur!= NULL)
{
if (x == cur->_data)
{
return cur;
}
else
{
cur = cur->_next;
}
}
printf("NOT EXIST!\n");
return NULL;
}
void DListAt(DListNode** ppHead, DListNode* pos, DataType x)//替换指定位置元素
{
assert(pos != NULL && ppHead!=NULL);
pos->_data = x;
/*DListNode* cur = *ppHead;
while (cur != NULL)
{
if (cur == pos)
{
cur->_data = x;
}
else
{
cur = cur->_next;
}
}
*/
}
void DListInsert(DListNode** ppHead, DListNode*pos, DataType x)//在指定位置插入
{
//assert(pos);
DListNode* prev = *ppHead;
DListNode* newNode = BuyDListNode(x);
if (NULL==prev || prev ==pos)
{
DListPushFront(ppHead, x);
}
else
{
prev = *ppHead;
while (prev->_next != pos)
{
prev = prev->_next;
}
newNode->_next = pos;
prev->_next = newNode;
}
}
void DListErase(DListNode** ppHead, DListNode*pos, DataType x)//删除指定位置元素
{
assert(pos != NULL &&ppHead != NULL);
DListNode* cur = *ppHead;//记录当前节点
DListNode* prev = NULL;//记录当前节点的前一个节点
if (pos == *ppHead)
{
free(cur);
cur->_next = NULL;
}
else
{
prev = *ppHead;
while (prev->_next != pos)
{
cur = cur->_next;
}
prev->_next = pos->_next;
free(pos);
}
}