首先定义头文件,与单链表的基本结构:LinkList.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 InitLinkList(pLinkList pList);//初始化
void DestroyList(pLinkList pList);//销毁
void PushBack(pLinkList pList,DataType x);//尾插
void PopBack(pLinkList pList);//尾删
void PushFront(pLinkList pList,DataType x);//头插
void PopFront(pLinkList pList);//头删
void PrintList(pLinkList pList);//打印
pLinkNode Find(pLinkList pList,DataType x);//查找指定结点地址返回
void Erase(pLinkList pList,pLinkNode pos);//删除指定位置结点
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 EraseNotTail(pLinkNode pos);//删除无头非尾结点的指定位置结点
void RerverseList(pLinkList pList);//反转(逆序)链表
void InsertFrontNode(pLinkNode pos,DataType x);//在当前结点前插入一个结点(无头结点)
pLinkNode FindMidNode(pLinkList pList);//寻找中间结点返回一个地址
void DelkNode(pLinkList pList,int k);//删除倒数第k个结点
#endif //_LINKLIST_H__
在源文件中,主函数中对其调节测试的过程:test.c单元
#include "LinkList.h"
void test1()
{
LinkList mylist;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,4);
PushBack(&mylist,5);
PushBack(&mylist,6);
PrintList(&mylist);
PopBack(&mylist);
PrintList(&mylist);
PopBack(&mylist);
PrintList(&mylist);
DestroyList(&mylist);
}
void test2()
{
LinkList mylist;
InitLinkList(&mylist);
PushFront(&mylist,1);
PushFront(&mylist,2);
PushFront(&mylist,3);
PushFront(&mylist,4);
PushFront(&mylist,5);
PushFront(&mylist,6);
PrintList(&mylist);
PopFront(&mylist);
PrintList(&mylist);
PopFront(&mylist);
PrintList(&mylist);
DestroyList(&mylist);
}
void test3()
{
LinkList mylist;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,4);
PushBack(&mylist,5);
PushBack(&mylist,6);
PrintList(&mylist);
Insert(&mylist,Find(&mylist,4),7);
PrintList(&mylist);
Insert(&mylist,Find(&mylist,7),8);
PrintList(&mylist);
Erase(&mylist,Find(&mylist,3));
PrintList(&mylist);
Erase(&mylist,Find(&mylist,1));
PrintList(&mylist);
DestroyList(&mylist);
}
void test4()
{
LinkList mylist;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,1);
PushBack(&mylist,4);
PushBack(&mylist,5);
PushBack(&mylist,6);
PushBack(&mylist,1);
PrintList(&mylist);
Remove(&mylist,4);
PrintList(&mylist);
Remove(&mylist,1);
PrintList(&mylist);
RemoveAll(&mylist,1);
PrintList(&mylist);
DestroyList(&mylist);
}
void test5()
{
LinkList mylist;
InitLinkList(&mylist);
PushBack(&mylist,7);
PushBack(&mylist,6);
PushBack(&mylist,5);
PushBack(&mylist,4);
PushBack(&mylist,3);
PushBack(&mylist,2);
PushBack(&mylist,1);
PrintList(&mylist);
Bubblesort(&mylist);
PrintList(&mylist);
DestroyList(&mylist);
}
void test6()
{
LinkList mylist;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,4);
PushBack(&mylist,5);
PushBack(&mylist,6);
PrintList(&mylist);
EraseNotTail(Find(&mylist,4));
PrintList(&mylist);
RerverseList(&mylist);
PrintList(&mylist);
RerverseList(&mylist);
PrintList(&mylist);
InsertFrontNode(Find(&mylist,5),4);
PrintList(&mylist);
DestroyList(&mylist);
}
void test7()
{
pLinkNode ret;
LinkList mylist;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,4);
PushBack(&mylist,5);
PrintList(&mylist);
ret=FindMidNode(&mylist);
printf("%d\n",ret->data);
}
void test8()
{
pLinkNode ret;
LinkList mylist;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,4);
PushBack(&mylist,5);
PrintList(&mylist);
DelkNode(&mylist,6);
PrintList(&mylist);
}
int main()
{
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
system("pause");
return 0;
}
在源文件中对其链表各种基本操作的具体代码实现:LinkList.c单元
#include"LinkList.h"
void InitLinkList(pLinkList pList)//初始化
{
assert(pList);
pList->pHead=NULL;
}
pLinkNode BuyNode(DataType x)//创建新结点
{
pLinkNode newNode=(pLinkNode)malloc(sizeof(LinkNode));
if(NULL==newNode)
{
printf("out of memory\n");
exit(EXIT_FAILURE);
}
newNode->data=x;
newNode->next=NULL;
return newNode;
}
void PushBack(pLinkList pList,DataType x)//尾插
{
pLinkNode newNode=NULL;
assert(pList);
newNode=BuyNode(x);
if(NULL==pList->pHead)//空链表
{
pList->pHead=newNode;
}
else//不为空链表
{
pLinkNode cur=pList->pHead;
while(NULL!=cur->next)
{
cur=cur->next;
}
cur->next=newNode;
}
}
void PrintList(pLinkList pList)//打印
{
pLinkNode cur=NULL;
assert(pList);
cur=pList->pHead;
while(cur)
{
printf("%d->",cur->data);
cur=cur->next;
}
printf("over\n");
}
void DestroyList(pLinkList pList)//销毁
{
pLinkNode cur=NULL;
assert(pList);
cur=pList->pHead;
while(cur)
{
pLinkNode del=cur;
cur=cur->next;
free(del);
del=NULL;
}
pList->pHead=NULL;
printf("销毁完成\n");
}
void PopBack(pLinkList pList)//尾删
{
pLinkNode cur=NULL;
pLinkNode prev=NULL;
assert(pList);
if(NULL==pList->pHead)//空链表
{
return;
}
else if(NULL==pList->pHead->next)//有一个结点
{
free(pList->pHead);
pList->pHead=NULL;
}
else//两个以上结点
{
cur=pList->pHead;
while(cur->next)
{
prev=cur;
cur=cur->next;
}
free(cur);
cur=NULL;
prev->next=NULL;
}
}
void PushFront(pLinkList pList,DataType x)//头插
{
pLinkNode newNode=NULL;
assert(pList);
newNode=BuyNode(x);
newNode->next=pList->pHead;
pList->pHead=newNode;
}
void PopFront(pLinkList pList)//头删
{
if(NULL==pList->pHead)//空链表
{
return;
}
else//非空链表
{
pLinkNode del=pList->pHead;
pList->pHead=pList->pHead->next;
free(del);
del=NULL;
}
}
pLinkNode Find(pLinkList pList,DataType x)//查找一个结点地址返回
{
pLinkNode cur=NULL;
assert(pList);
cur=pList->pHead;
while(cur)
{
if(cur->data==x)
{
return cur;
}
cur=cur->next;
}
return;
}
void Insert(pLinkList pList,pLinkNode pos,DataType x)//在结点4之后插入结点7
{
pLinkNode newNode=NULL;
assert(pList);
if(pos==NULL)
{
return;
}
newNode=BuyNode(x);
newNode->next=pos->next;
pos->next=newNode;
}
void Erase(pLinkList pList,pLinkNode pos)//删除指定位置结点
{
pLinkNode cur=NULL;
pLinkNode del=NULL;
pLinkNode prev=NULL;
assert(pList);
cur=pList->pHead;
while(cur)
{
if(cur==pos)
{
if(cur==pList->pHead)
{
del=cur;
pList->pHead=cur->next;
free(del);
del=NULL;
}
else
{
del=cur;
prev->next=cur->next;
free(del);
del=NULL;
}
return;
}
else
{
prev=cur;
cur=cur->next;
}
}
}
void Remove(pLinkList pList,DataType x)//删除指定结点
{
pLinkNode cur=NULL;
pLinkNode del=NULL;
pLinkNode prev=NULL;
assert(pList);
cur=pList->pHead;
while(cur)
{
if(cur->data==x)
{
if(cur==pList->pHead)
{
del=cur;
pList->pHead=cur->next;
free(del);
del=NULL;
}
else
{
del=cur;
prev->next=cur->next;
free(del);
del=NULL;
}
return;
}
else
{
prev=cur;
cur=cur->next;
}
}
}
void RemoveAll(pLinkList pList,DataType x)//删除出现的所有指定结点
{
pLinkNode cur=NULL;
pLinkNode del=NULL;
pLinkNode prev=NULL;
assert(pList);
cur=pList->pHead;
while(cur)
{
if(cur->data==x)
{
if(cur==pList->pHead)
{
del=cur;
pList->pHead=cur->next;
free(del);
del=NULL;
}
else
{
del=cur;
prev->next=cur->next;
free(del);
del=NULL;
}
cur=cur->next;
}
else
{
prev=cur;
cur=cur->next;
}
}
}
void Bubblesort(pLinkList pList)//冒泡排序
{
pLinkNode cur=NULL;
pLinkNode tail=NULL;
assert(pList);
cur=pList->pHead;
if((pList->pHead==NULL)||(pList->pHead->next==NULL))
{
return;
}
while(cur!=tail)
{
while(cur->next!=tail)
{
if((cur->data)>(cur->next->data))
{
DataType tmp=cur->data;
cur->data=cur->next->data;
cur->next->data=tmp;
}
cur=cur->next;
}
tail=cur;
cur=pList->pHead;
}
}
//面试题链表
void EraseNotTail(pLinkNode pos)//删除无头非尾结点的指定位置结点
{
pLinkNode del=NULL;
assert(pos->next!=NULL);
del=pos->next;
pos->data=pos->next->data;
pos->next=pos->next->next;
free(del);
del=NULL;
}
void RerverseList(pLinkList pList)//反转(逆序)链表
{
pLinkNode cur=NULL;
pLinkNode tmp=NULL;
pLinkNode newHead=NULL;
assert(pList);
cur=pList->pHead;
while(cur)
{
tmp=cur;
cur=cur->next;
tmp->next=newHead;
newHead=tmp;
}
pList->pHead=newHead;
}
void InsertFrontNode(pLinkNode pos,DataType x)//在当前结点前插入一个结点(无头结点)
{
DataType tmp=0;
pLinkNode newHead=BuyNode(x);
newHead->next=pos->next;
pos->next=newHead;
tmp=pos->data;
pos->data=newHead->data;
newHead->data=tmp;
}
pLinkNode FindMidNode(pLinkList pList)//寻找中间结点返回一个地址
{
pLinkNode slow=NULL;
pLinkNode fast=NULL;
assert(pList);
slow=pList->pHead;
fast=pList->pHead;
while((fast!=NULL)&&(fast->next!=NULL))
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
void DelkNode(pLinkList pList,int k)//删除倒数第k个结点
{
pLinkNode front=NULL;
pLinkNode back=NULL;
DataType i=0;
assert(pList);
front=pList->pHead;
back=pList->pHead;
if(pList->pHead==NULL)
{
return;
}
for(i=1;i<=k-1;i++)
{
front=front->next;
}
while((front!=NULL)&&(front->next!=NULL))
{
front=front->next;
back=back->next;
}
Erase(pList,back);
}
以上为对于单链表的各种实现操作...........