本文主要介绍了单链表的初始化/头插/头删/尾插/尾删/查找/指定位删除/指定数删除/指定位插入/销毁/排序等.
头文件
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;
typedef struct LinkNode
{
DataType data;
struct LinkNode* next;
}LinkNode,*pLinkNode;
typedef struct LinkList
{
LinkNode* pHead;
}LinkList,*pLinkList;
void PrintList(pLinkList pList);//打印函数
void InitLinkList(pLinkList pList);//初始化函数
void PushBack(pLinkList pList,DataType x);//尾插
void PopBack(pLinkList pList);//尾删
void PushFront(pLinkList pList,DataType x);//头插
void PopFront(pLinkList pList);//头删
pLinkNode Find(pLinkList pList,DataType x);
void Insert(pLinkList pList,pLinkNode pos,DataType x);//指定为插入
void Remove(pLinkList pList,DataType x);//指定数删除
void RemoveAll(pLinkList pList,DataType x);//删除所有
void BubbleSort(pLinkList pList);//排序
void Erase(pLinkList pList,pLinkNode pos);//指定位删除
void Destroy(pLinkList pList);//销毁
#endif //__LINKLIST_H__
函数部分
#include"LinkList.h"
void PrintList(pLinkList pList)//打印函数
{
pLinkNode cur=NULL;
assert(pList);
cur = pList->pHead;
while(cur!=NULL)
{
printf("%d->",cur->data);
cur=cur->next;
}
printf("NULL\n");
}
void InitLinkList(pLinkList pList)//初始化函数
{
assert(pList);
//pLinkNode cur;
//cur=(pLinkNode)malloc(sizeof(LinkNode));
//if(cur==NULL)
//{
// printf("单链表初始化失败\n");
//}
//cur->next=NULL;
pList->pHead=NULL;
}
void PushBack(pLinkList pList,DataType x)//尾插
{
assert(pList);
pLinkNode cur=NULL;
pLinkNode pre=NULL;
pLinkNode newNode=(pLinkNode)malloc(sizeof(LinkNode));
if(newNode==NULL)
{
printf("out of memeroy");
exit(EXIT_FAILURE);
}
cur=pList->pHead;
newNode->data=x;
newNode->next=NULL;
if(cur==NULL)
{
pList->pHead=newNode;
return;
}
while(cur)
{
pre=cur;
cur=cur->next;
}
pre->next=newNode;
}
void PopBack(pLinkList pList)//尾删
{
//assert(pList);
//pLinkNode pre=pList->pHead;
//pLinkNode cur=NULL;
//while(pList)
//{
// cur=pre;
// pre=pre->next;
//}
//pre->next=NULL;
//free(pre);
//
assert(pList);
pLinkNode cur=NULL;
pLinkNode pre=NULL;
cur = pList->pHead;
if(pList->pHead==NULL)
{
return;
}
else if(cur->next==NULL)
{
pList->pHead=cur->next;
free(cur);
cur=NULL;
}
else
{
while(cur->next)
{
pre=cur;
cur=cur->next;
}
free(cur);
cur=NULL;
pre->next=NULL;
}
}
void PushFront(pLinkList pList,DataType x)//头插
{
assert(pList);
pLinkNode cur=pList->pHead;
pLinkNode pre=(pLinkNode)malloc(sizeof(LinkNode));
pre->data=x;
pre->next=cur;
pList->pHead=pre;
}
void PopFront(pLinkList pList)//头删
{
assert(pList);
pLinkNode cur=NULL;
cur=pList->pHead;
if(cur==NULL)
printf("链表为空\n");
pList->pHead=cur->next;
free(cur);
cur=NULL;
}
pLinkNode Find(pLinkList pList,DataType x)
{
assert(pList);
pLinkNode cur=pList->pHead;
while(cur)
{
if(cur->data==x)
break;
cur=cur->next;
}
return cur;
}
void Insert(pLinkList pList,pLinkNode pos,DataType x)//指定位插入
{
assert(pList);
pLinkNode cur=NULL;
pLinkNode pre=NULL;
DataType tmp=x;
pLinkNode newNode=(pLinkNode)malloc(sizeof(LinkNode));
newNode->data=tmp;
cur=pList->pHead;
if(cur==NULL)
{
PushFront(pList,x);
return;
}
if(pos==NULL)
{
printf("无此位置\n");
return;
}
newNode->next=pos->next;
pos->next=newNode;
tmp=pos->data;
pos->data=newNode->data;
newNode->data=tmp;
}
void Remove(pLinkList pList,DataType x)//指定数删除
{
assert(pList);
pLinkNode cur;
cur=pList->pHead;
while(cur)
{
if(cur->data==x)
{
pLinkNode p=NULL;
cur->data=cur->next->data;
p=cur->next;
cur->next=cur->next->next;
free(p);
p=NULL;
}
cur=cur->next;
}
return;
}
void RemoveAll(pLinkList pList,DataType x)//删除所有
{
assert(pList);
pLinkNode cur=NULL;
pLinkNode pre=NULL;
cur=pList->pHead;
while(cur)
{
if(cur->data==x)
{
pre=cur->next;
if(cur==pList->pHead)
{
PopFront(pList);
cur=pre;
}
else if(cur->next==NULL)
{
PopBack(pList);
cur=NULL;
break;
}
else
{
pLinkNode p=NULL;
cur->data=cur->next->data;
p=cur->next;
cur->next=cur->next->next;
free(p);
p=NULL;
}
}
else
{
cur=cur->next;
}
}
}
void BubbleSort(pLinkList pList)//排序
{
pLinkNode i;
pLinkNode j;
assert(pList);
for(i=pList->pHead;i!=NULL;i=i->next)
{
for(j=i->next;j!=NULL;j=j->next)
{
if(j->data<i->data)
{
DataType tmp=j->data;
j->data=i->data;
i->data=tmp;
}
}
}
}
void Erase(pLinkList pList,pLinkNode pos)//指定位删除
{
assert(pList);
pLinkNode cur;
pLinkNode pre;
cur=pList->pHead;
if(pos==cur)
{
PopFront(pList);
return;
}
while(pos!=cur)
{
pre=cur;
cur=cur->next;
}
pre->next=pos->next;
free(pos);
pos=NULL;
}
void Destroy(pLinkList pList)//销毁
{
pLinkNode cur=pList->pHead;
assert(pList);
while(cur)
{
pLinkNode tmp=cur;
cur=cur->next;
free(tmp);
tmp=NULL;
}
pList->pHead=NULL;
}
测试部分
#include"LinkList.h"
void test()
{
LinkList List={0};
InitLinkList(&List);
PushBack(&List,1);
PushBack(&List,2);
PushBack(&List,3);
PushBack(&List,4);
PushBack(&List,5);
PushBack(&List,6);
PrintList(&List);
PushBack(&List,8);
PrintList(&List);
PopBack(&List);
PopBack(&List);
PrintList(&List);
PushFront(&List,9);
PushFront(&List,10);
PushFront(&List,11);
PrintList(&List);
PopFront(&List);
PrintList(&List);
Find(&List,9);
Insert(&List,Find(&List,2),12);
PrintList(&List);
Remove(&List,4);
PrintList(&List);
PushBack(&List,3);
PushBack(&List,3);
PushBack(&List,3);
PushBack(&List,3);
PrintList(&List);
RemoveAll(&List,3);
PrintList(&List);
BubbleSort(&List);
PrintList(&List);
Erase(&List,Find(&List,2));
PrintList(&List);
Destroy(&List);
PrintList(&List);
}
int main()
{
test();
system("pause");
return 0;
}
最近有点懒,就不多说了
一