C语言链表模板
#include <stdio.h>
#include <stdlib.h>
/************************************************
* C语言链表模板
*
* 1.InitLinkList(ElemType data) 初始化链表:动态分
* 配头结点,并对头结点的next赋NULL值和数据域赋值,返回
* 头结点地址.
*
* 2.InsertLinkList(LinkList *head, ElemType data)
* 添加数据:找到链表的表尾,动态生成一个新结点,对新结点
* 的next赋NULL值和数据域赋值并将新结点添加到链表尾部.
*
* 3.DeleteLinkList(LinkList *head, ElemType dele
* teData) 删除数据:找到需要删除的数据的结点,让这个结
* 点的上一个结点指向它的下一个结点并释放该结点,没有找
* 到则提示没有找到需要删除的数据.
*
* 4.void UpdateLinkList(LinkList *head, ElemType
* deleteData, ElemType updateData) 更新数据:找到
* 需要更新的数据并进行更新,如果没有找到则提示没有找到
* 需要更新的数据.
*
* 5.SelectLinkList(LinkList *head, ElemType data)
* 查找数据:遍历所有结点查找是否有该数据,找到返回TRUE
* 没有找到返回FALSE.
*
* 6.DestoryLinkList(LinkList *head) 销毁链表:释放
* 链表中的所有结点并将头指针赋NULL值.
*
* 7.DisPlayLinkList(LinkList *head) 输出链表数据.
*
* 8.OrderLinkList(LinkList *head) 数据排序:将原有链
* 表赋值一份进行冒泡排序,排序完成后对赋值的链表进行输出
* 和销毁.
*
* 作者:西瓜小羽毛
* 日期:2020/7/22
************************************************/
#define TRUE 1
#define FALSE 0
typedef bool BOOL;
typedef int ElemType;
typedef struct LinkList
{
ElemType data;
LinkList *next;
} LinkList;
/* 初始化链表 */
LinkList *InitLinkList(ElemType data)
{
LinkList *head = (LinkList *)malloc(sizeof(LinkList));
head->next = NULL;
head->data = data;
return head;
}
/* 添加数据 */
void InsertLinkList(LinkList *head, ElemType data)
{
if (head == NULL)
{
printf("链表未初始化\n");
return;
}
LinkList *pNode = head;
while (pNode->next)
{
pNode = pNode->next;
}
pNode->next = (LinkList *)malloc(sizeof(LinkList));
pNode = pNode->next;
pNode->next = NULL;
pNode->data = data;
}
/* 删除数据 */
void DeleteLinkList(LinkList *head, ElemType deleteData)
{
if (head == NULL)
{
printf("链表未初始化\n");
return;
}
LinkList *pNode = head;
LinkList *qNode = NULL;
if (pNode->data == deleteData)
{
qNode = pNode->next;
pNode->data = qNode->data;
pNode->next = qNode->next;
free(qNode);
return;
}
while (pNode->next)
{
if (pNode->next->data == deleteData)
{
break;
}
pNode = pNode->next;
}
if (pNode->next == NULL)
{
printf("没有找到需要删除的数据\n");
return;
}
else
{
pNode->next = pNode->next->next;
return;
}
}
/* 更新数据 */
void UpdateLinkList(LinkList *head, ElemType deleteData, ElemType updateData)
{
if (head == NULL)
{
printf("链表未初始化\n");
return;
}
LinkList *pNode = head;
while (pNode)
{
if (pNode->data == deleteData)
{
break;
}
pNode = pNode->next;
}
if (pNode == NULL)
{
printf("没有找到要修改的数据\n");
return;
}
else
{
pNode->data = updateData;
return;
}
}
/* 查找数据 */
BOOL SelectLinkList(LinkList *head, ElemType data)
{
if (head == NULL)
{
printf("链表未初始化\n");
return FALSE;
}
LinkList *pNode = head;
while (pNode)
{
if (pNode->data == data)
{
break;
}
pNode = pNode->next;
}
if (pNode == NULL)
{
printf("没有找到你需要的数据\n");
return FALSE;
}
else
{
return TRUE;
}
}
/* 销毁链表 */
void DestoryLinkList(LinkList *head)
{
if (head == NULL)
{
printf("链表未初始化\n");
return;
}
LinkList *pNode = head;
LinkList *pNext = head->next;
while (pNext)
{
free(pNode);
pNode = pNext;
pNext = pNext->next;
}
free(pNode);
}
/* 输出链表 */
void DisPlayLinkList(LinkList *head)
{
if (head == NULL)
{
printf("链表未初始化\n");
return;
}
LinkList *pNode = head;
while (pNode)
{
printf("%d ", pNode->data);
pNode = pNode->next;
}
printf("\n");
}
/* 数据排序 */
void OrderLinkList(LinkList *head)
{
if (head == NULL)
{
printf("链表未初始化\n");
return;
}
/* 复制链表 */
LinkList *tHead = (LinkList *)malloc(sizeof(LinkList));
tHead->next = NULL;
tHead->data = head->data;
LinkList *pNode = head;
LinkList *ptNode = tHead;
while (pNode->next)
{
LinkList *node = (LinkList *)malloc(sizeof(LinkList));
node->data = pNode->next->data;
node->next = NULL;
ptNode->next = node;
ptNode = ptNode->next;
pNode = pNode->next;
}
ptNode = tHead;
LinkList *qtNode = NULL;
while (ptNode->next)
{
qtNode = tHead;
while (qtNode->next)
{
if (qtNode->data > qtNode->next->data)
{
ElemType data = qtNode->next->data;
qtNode->next->data = qtNode->data;
qtNode->data = data;
}
qtNode = qtNode->next;
}
ptNode = ptNode->next;
}
/* 输出排序后的链表 */
DisPlayLinkList(tHead);
/* 销毁复制的链表 */
DestoryLinkList(tHead);
}
测试代码
#include "LinkList.h"
int main()
{
/* 链表测试代码 */
LinkList *head = InitLinkList(30);
InsertLinkList(head, 35);
InsertLinkList(head, 24);
InsertLinkList(head, 25);
InsertLinkList(head, 56);
DeleteLinkList(head, 10);
DeleteLinkList(head, 30);
printf("排序前:");
DisPlayLinkList(head);
printf("排序后:");
OrderLinkList(head);
}
输出结果
没有找到需要删除的数据
排序前:35 24 25 56
排序后:24 25 35 56