</pre><p><span style="font-size:18px;">实现从前到后访问的单向链表</span></p><p><span style="font-size:24px;color:#3366ff;">LinkList.h</span><pre name="code" class="html"><span style="font-size:18px;">#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 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 PrintList(PLinkList PList);
void DestoryList(PLinkList PList);
void Erase(PLinkList PList,PLinkNode pos);
void BubbleSort(PLinkList PList);
#endif //__LINKLIST_H__</span>
LinkList.c
<span style="font-size:18px;">#include "LinkList.h"
void InitLinkList(PLinkList PList) //初始化链表
{
assert(PList); //pHead可以为空,不能断言
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 cur=NULL;
PLinkNode newNode=NULL;
assert(PList);
newNode=BuyNode(x);
if(NULL==PList->pHead)
{
PList->pHead=newNode;
return;
}
else
{
cur=PList->pHead; //cur指向头指针
while(cur->next !=NULL)
{
cur=cur->next ; //cur最后指向最后一个结点
}
cur->next =newNode;
}
}
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) //查找x,返回地址
{
PLinkNode ret=PList->pHead ;
assert(PList);
if(NULL==PList->pHead ) //空链表
{
return NULL;
}
else
{
while(ret)
{
if(ret->data==x)
return ret;
ret=ret->next ;
}
return NULL;
}
}
void Insert(PLinkList PList,PLinkNode pos,DataType x) //在pos前插data=x的结点
{
PLinkNode cur=PList->pHead ;
PLinkNode newNode=NULL;
assert(PList);
assert(pos);
newNode=BuyNode(x);
if(cur==pos) //在第一个结点之前插
{
PushFront(PList,x); //直接使用头插的函数
}
while(cur)
{
if(cur->next ==pos)
{
cur->next=newNode;
newNode->next =pos;
}
cur=cur->next ;
}
}
void Remove(PLinkList PList,DataType x) //删除data=x的结点
{
PLinkNode cur=PList->pHead ;
//PLinkNode del=NULL;
PLinkNode prev=NULL;
assert(PList);
if(PList->pHead ==NULL) //无结点
return;
if(cur->data ==x) //删除第一个结点
{
PopFront(PList);
}
else
{
while(cur&&(cur->data !=x))
{
prev=cur; //记住前一个结点
cur=cur->next ;
}
if(cur==NULL)
return; //找不到
else
{
//del=cur;
prev->next =cur->next ;
free(cur);
}
}
}
void Erase(PLinkList PList,PLinkNode pos) //删除地址是POS的结点
{
PLinkNode cur=NULL;
PLinkNode prev=NULL;
assert(PList);
cur=PList->pHead ;
if(PList->pHead ==NULL) //空链表
return;
if(cur==pos) //第一个结点
PopFront(PList);
else
{
while(cur)
{
if(cur==pos)
{
prev->next =cur->next ;
free(cur);
return; //非常重要
}
else
{
prev=cur;
cur=cur->next ;
}
}
}
}
void BubbleSort(PLinkList PList) //冒泡排序(升序)
{
PLinkNode cur=PList->pHead ;
PLinkNode tail=NULL;
while(cur!=tail) //外层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; //第一次tail走到最后一个位置
cur=PList->pHead ;
}
}
void PrintList(PLinkList PList)
{
PLinkNode cur=PList->pHead ;
assert(PList);
while(cur!=NULL)
{
printf("%d->",cur->data);
cur=cur->next;
}
printf("over\n");
}
void DestoryList(PLinkList PList)
{
PLinkNode cur=PList->pHead ;
assert(PList);
while(cur!=NULL)
{
PLinkNode del=cur;
cur=cur->next ;
free(del);
del=NULL;
}
PList->pHead =NULL;
}</span>
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);
// PrintList(&mylist);
// PopBack(&mylist);
// PrintList(&mylist);
// PopBack(&mylist);
// PrintList(&mylist);
// DestoryList(&mylist);
//}
//void test2()
//{
// LinkList mylist;
// InitLinkList(&mylist);
// PushFront(&mylist,1);
// PushFront(&mylist,2);
// PushFront(&mylist,3);
// PushFront(&mylist,4);
// PushFront(&mylist,5);
// PrintList(&mylist);
// PopFront(&mylist);
// PrintList(&mylist);
// PopFront(&mylist);
// PrintList(&mylist);
// PopFront(&mylist);
// PrintList(&mylist);
// DestoryList(&mylist);
//}
void test3()
{
LinkList mylist;
PLinkNode ret=NULL;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,3);
PushBack(&mylist,2);
PushBack(&mylist,5);
PushBack(&mylist,4);
PrintList(&mylist);
//Insert(&mylist,Find(&mylist,3),6);
//Insert(&mylist,Find(&mylist,1),6);
//Remove(&mylist,1);
//Erase(&mylist,Find(&mylist,3));
BubbleSort(&mylist);
PrintList(&mylist);
DestoryList(&mylist);
}
int main()
{
//test1();
//test2();
test3();
system("pause");
return 0;
}