LinkList.h
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int DataType;
typedef struct LinkNode
{
DataType _data;
struct LinkNode* next;
}LinkNode,*pLinkNode;
typedef struct LinkList
{
LinkNode* _pHead;
}LinkList,*pLinkList;
void Init_LinkList(pLinkList plist);
void Free_LinkList(pLinkList plist);
void Push_Back(pLinkList plist, DataType data);//尾插
void Pop_Back(pLinkList plist); //尾删
void Push_Front(pLinkList plist, DataType data);//头插
void Pop_Front(pLinkList plist); //头删
void Print_LinkList(pLinkList plist); //打印
pLinkNode Find_NUM(pLinkList plist, DataType data); //找指定节点
void Insert_Back(pLinkList plist, pLinkNode pos, DataType data);//当前结点后插入
void Insert_Front(pLinkList plist, pLinkNode pos, DataType data);//当前节点前插入
void Remove_LinkList(pLinkList plist, DataType data);//删除指定元素
void Remove_all(pLinkList plist, DataType data); //删除所有指定元素
void Bubble_Sort(pLinkList plist); //排序
void Erase_LinkList(pLinkList plist, pLinkNode pos);//删除指定位置元素
LinkListFun.h
#include"LinkList.h"
void Init_LinkList(pLinkList plist)
{
assert(plist);
plist->_pHead = NULL;
//plist->_pHead->next = NULL;
}
void Free_LinkList(pLinkList plist)
{
assert(plist);
pLinkNode cur = plist->_pHead;
pLinkNode tmp = NULL;
while (cur)
{
tmp = cur;
free(tmp);
cur = cur->next;
}
plist->_pHead = NULL;
}
pLinkNode creatN(DataType data)
{
pLinkNode newNode = (pLinkNode)malloc(sizeof(LinkList));
if (NULL == newNode)
{
printf("out of memory");
exit(EXIT_FAILURE);
}
newNode->_data = data;
newNode->next = NULL;
return newNode;
}
void Push_Back(pLinkList plist, DataType data)//尾插
{
assert(plist);
pLinkNode cur = plist->_pHead;
pLinkNode newNode = creatN(data);
if (cur== NULL)//空
{
plist->_pHead = newNode;
return;
}
else
{
while (cur->next)
{
cur = cur->next;
}
cur->next = newNode;
}
}
void Pop_Back(pLinkList plist)//尾删
{
assert(plist);
pLinkNode cur = plist->_pHead;
pLinkNode tmp = NULL;
if (cur== NULL)//
{
printf("空链表\n");
return;
}
else if (plist->_pHead ->next == NULL) //错误多发
{
plist->_pHead = NULL;
free(plist->_pHead);
return;
}
else
{
while (cur->next->next )
{
//tmp = cur;
cur = cur->next;
}
cur->next = NULL;
free(cur->next); //
}
}
void Push_Front(pLinkList plist, DataType data)//头插
{
assert(plist);
pLinkNode cur = plist->_pHead;
pLinkNode newNode = creatN(data);
newNode->next = cur;
plist->_pHead = newNode;
//cur->next = newNode;
}
void Pop_Front(pLinkList plist) //头删
{
assert(plist);
pLinkNode cur = plist->_pHead;
plist->_pHead = cur->next;
}
void Print_LinkList(pLinkList plist)//打印
{
assert(plist);
pLinkNode cur = plist->_pHead;
while (cur)
{
printf("%d->", cur->_data);
cur = cur->next;
}
printf("NULL\n");
}
pLinkNode Find_NUM(pLinkList plist, DataType data) //找指定节点
{
assert(plist);
pLinkNode cur = plist->_pHead;
while (cur)
{
if (cur->_data == data)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void Insert_Back(pLinkList plist, pLinkNode pos, DataType data)//当前结点后插入
{
assert(plist);
pLinkNode cur = plist->_pHead;
pLinkNode tmp = NULL;
pLinkNode newNode = creatN(data);
while (cur == pos)
{
cur = cur->next;
}
newNode->next = cur->next;
cur->next =newNode;
}
void Insert_Front(pLinkList plist, pLinkNode pos, DataType data)//当前节点前插入
{
assert(plist);
pLinkNode cur = plist->_pHead;
pLinkNode tmp = NULL;
pLinkNode newNode = creatN(data);
if (cur == pos)
{
newNode->next = cur;
plist->_pHead= newNode;
return;
}
cur = cur->next;
while (cur != pos)
{
tmp = cur;
cur = cur->next;
}
newNode->next = cur;
tmp ->next = newNode;
}
void Remove_LinkList(pLinkList plist, DataType data)//删除指定元素
{
assert(plist);
pLinkNode cur = plist->_pHead;
pLinkNode tmp = NULL;
while (cur)
{
if (cur->_data == data)//第一个元素为要删除元素
{
tmp = cur;
plist->_pHead = tmp->next;
//cur = NULL;
/*tmp = NULL;
free(tmp);*/
break;
}
if (cur->next ->_data == data)
{
tmp = cur->next;
cur->next = tmp->next;
break;
}
cur = cur->next;
}
tmp= NULL;
free(tmp);
}
void Remove_all(pLinkList plist, DataType data) //删除所有指定元素
{
assert(plist);
pLinkNode cur = plist->_pHead;
pLinkNode tmp = NULL;
if (cur->_data == data)//第一个元素为要删除元素
{
tmp = cur;
plist->_pHead = tmp->next;
tmp = NULL;
free(tmp);
}
cur = cur->next;
while (cur)
{
if (cur->next->next == NULL)//最后一个元素为要删除元素
{
tmp = cur->next;
tmp = NULL;
free(tmp);
break;
}
if (cur->next ->_data == data)
{
tmp = cur->next;
cur->next = tmp->next;
tmp = NULL;
free(tmp);
}
cur = cur->next;
}
}
int Len(pLinkList plist)
{
assert(plist);
pLinkNode cur = plist->_pHead;
int count = 0;
while (cur)
{
cur = cur->next;
count++;
}
return count;
}
void Bubble_Sort(pLinkList plist) //排序
{
assert(plist);
pLinkNode cur = plist->_pHead;
pLinkNode cur1 = NULL;
DataType tmp =0;
int count = 0;
int size = Len(plist);
while (cur)//冒泡排序用链表的大小来控制排序次数
{
if (size == 1)
return;
cur1 = cur;
count = 1;
while (cur1->next )
{
if (count == size)
break;
if (cur1->_data > cur1->next->_data)
{
tmp = cur1->next->_data;
cur1->next->_data = cur1->_data;
cur1->_data = tmp;
}
cur1 = cur1->next;
count++; //内部循环次数
}
size--;//每循环一次 外部循环剪掉最后一个数
//cur = cur->next;
}
}
void Erase_LinkList(pLinkList plist, pLinkNode pos)//删除指定位置元素
{
assert(plist);
pLinkNode cur = plist->_pHead;
if (cur == pos)
{
plist->_pHead = cur->next;
pos = NULL;
free(pos);
return;
}
while (cur)
{
if (cur->next== pos)
{
cur->next = cur->next->next;
pos = NULL;
free(pos);
return;
}
cur = cur->next;
}
}
test.c
#include"LinkListFun.h"
void test1()
{
LinkList p1;
Init_LinkList(&p1);
Push_Back(&p1, 1);
Push_Back(&p1, 3);
Push_Back(&p1, 2);
Push_Back(&p1, 0);
Push_Back(&p1, 5);
Print_LinkList(&p1);
Pop_Back(&p1);
Print_LinkList(&p1);
Pop_Back(&p1);
Print_LinkList(&p1);
Pop_Back(&p1);
Print_LinkList(&p1);
Pop_Back(&p1);
Print_LinkList(&p1);
Pop_Back(&p1);
Print_LinkList(&p1);
Pop_Back(&p1);
Print_LinkList(&p1);
}
void test2()
{
LinkList p1;
Init_LinkList(&p1);
Push_Back(&p1, 1);
Push_Back(&p1, 3);
Push_Back(&p1, 2);
Push_Back(&p1, 0);
Push_Back(&p1, 5);
Print_LinkList(&p1);
Push_Front(&p1,4);
Print_LinkList(&p1);
Push_Front(&p1, 6);
Print_LinkList(&p1);
}
void test3()
{
LinkList p1;
Init_LinkList(&p1);
Push_Back(&p1, 1);
Push_Back(&p1, 3);
Push_Back(&p1, 2);
Push_Back(&p1, 0);
Push_Back(&p1, 5);
Push_Back(&p1, 6);
Push_Back(&p1, 7);
Print_LinkList(&p1);
Pop_Front(&p1);
Print_LinkList(&p1);
}
void test4()
{
LinkList p1;
pLinkNode ret = NULL;
Init_LinkList(&p1);
Push_Back(&p1, 1);
Push_Back(&p1, 3);
Push_Back(&p1, 2);
Push_Back(&p1, 0);
Push_Back(&p1, 5);
Push_Back(&p1, 6);
Push_Back(&p1, 7);
Print_LinkList(&p1);
ret=Find_NUM(&p1, 5);
if (ret == NULL)
printf("-1");
else
printf("%d", ret->_data);
}
void test5()
{
LinkList p1;
pLinkNode ret = NULL;
Init_LinkList(&p1);
Push_Back(&p1, 1);
Push_Back(&p1, 3);
Push_Back(&p1, 2);
Push_Back(&p1, 0);
Push_Back(&p1, 2);
Push_Back(&p1, 6);
Push_Back(&p1, 7);
Print_LinkList(&p1);
Remove_LinkList(&p1, 7);
//Remove_all(&p1, 2);
Print_LinkList(&p1);
}
void test6()
{
LinkList p1;
Init_LinkList(&p1);
Push_Back(&p1, 1);
Push_Back(&p1, 3);
Push_Back(&p1, 2);
Push_Back(&p1, 0);
Push_Back(&p1, 2);
Push_Back(&p1, 6);
Push_Back(&p1, 7);
Print_LinkList(&p1);
Bubble_Sort(&p1);
Print_LinkList(&p1);
}
void test7()
{
LinkList p1;
Init_LinkList(&p1);
Push_Back(&p1, 1);
Push_Back(&p1, 3);
Push_Back(&p1, 2);
Push_Back(&p1, 0);
Push_Back(&p1, 2);
Push_Back(&p1, 6);
Push_Back(&p1, 7);
Print_LinkList(&p1);
/*Erase_LinkList(&p1, Find_NUM(&p1,1));
Print_LinkList(&p1);*/
//Insert_Front(&p1,Find_NUM(&p1,0),4 );
//Print_LinkList(&p1);
Insert_Back(&p1,Find_NUM(&p1,1),5);
Print_LinkList(&p1);
}
int main()
{
//test1();
//test2();
//test3();
//test5();
//test6();
test7();
getchar();
return 0;
}