typedef int DataType;
typedef struct ListNode
{
DataType data;
ListNode* next;
}ListNode;
注:
1.以下函数都是针对无环单链表
2.若可能修改到原链表头结点,都要传二级指针
函数如下:
ListNode* BuyNode(DataType x); //开辟新节点
void PushBack(ListNode** list, DataType data); //尾插
void PopBack(ListNode** list); //尾删
void PushFront(ListNode** list, DataType data); //头插
void PopFront(ListNode** list); //头删
void Insert(ListNode** pplist, ListNode* pos, DataType data); //定点插入
void Erase(ListNode** pplist, ListNode* pos); //定点删除
void PrintList(ListNode* list); //打印
ListNode* Find(ListNode* plist, DataType data); //查找
void DestoryList(ListNode** pplist); //释放单链表(若有环,先解环)
1.开辟新节点
ListNode* BuyNode(DataType x)
{
ListNode* p = (ListNode*)malloc(sizeof(ListNode));
p -> data = x;
p -> next = NULL;
return p;
}
2.尾插
void PushBack(ListNode** pplist, DataType data)
{
//1.空 2.非空
assert(pplist);
if (*pplist == NULL)
{
*pplist = BuyNode(data);
}
else
{
ListNode* tail = *pplist;
while(tail -> next)
{
tail = tail -> next;
}
tail -> next = BuyNode(data);
}
}
3.尾删
void PopBack(ListNode** pplist)
{
//1.空 2.1个 3.多个
assert(pplist);
if (*pplist == NULL)
{
return;
}
else if ((*pplist) -> next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
ListNode* tail = *pplist;
ListNode* prev = NULL;
while (tail -> next)
{
prev = tail;
tail = tail -> next;
}
free(tail);
prev -> next = NULL;
}
}
4.头插
void PushFront(ListNode** pplist, DataType data)
{
//1.空 2.非空
assert(pplist);
if (*pplist == NULL)
{
*pplist = BuyNode(data);
}
else
{
ListNode* p = BuyNode(data);
p -> next = *pplist;
*pplist = p;
}
}
5.头删
void PopFront(ListNode** pplist)
{
//1.空 2.1个 3.多个
assert(pplist);
if (*pplist == NULL)
{
return;
}
else if ((*pplist)-> next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
ListNode* p = (*pplist) -> next;
free(*pplist);
*pplist = p;
}
}
6.定点插入
void Insert(ListNode** pplist, ListNode* pos, DataType data)
{
assert(pplist);
assert(pos);
if (pos == *pplist)
{
PushFront(pplist, data);
}
else
{
ListNode* prev = *pplist;
while ((prev->next) != pos)
{
prev = prev -> next;
}
prev -> next = BuyNode(data);
(prev -> next) -> next = pos;
}
}
7.定点删除
void Erase(ListNode** pplist, ListNode* pos)
{
assert(pplist);
assert(pos);
if (pos == *pplist)
{
PopFront(pplist);
}
else if (pos -> next == NULL)
{
PopBack(pplist);
}
else
{
ListNode* prev = *pplist;
while ((prev -> next) != pos)
{
prev = prev -> next;
}
prev -> next = pos -> next;
free(pos);
}
}
8.打印
void PrintList_r(ListNode* plist)
{
if (plist == NULL)
{
return;
}
PrintList_r (plist -> next);
printf("%d->", plist -> data);
}
9.查找
ListNode* Find(ListNode* plist, DataType data)
{
ListNode* cur = plist;
while (cur)
{
if (cur -> data == data)
{
return cur;
}
cur = cur -> next;
}
return NULL;
}
10.释放
void DestoryList(ListNode** pplist)
{
assert(pplist);
ListNode* cur = *pplist;
while(cur)
{
ListNode* next = cur->next;
free(cur);
cur = next;
}
*pplist = NULL;
}