“link.h”
#ifndef __LINK_LIST_H__
#define __LINK_LIST_H__
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <malloc.h>
typedef int DataType;
typedef struct LinkNode
{
DataType data;
struct LinkNode *next;
}LinkNode,*pLinkNode,*pList;
void InitLinkList(pList* pHead);
//void Destroy(pList *pHead);
void PushBack(pList* pHead, DataType x);
void PrintList(pList list);
pLinkNode Find(pList head, DataType x);
void EraseNotTail(pLinkNode pos);//删除无头单链表的非尾节点
void ReverseList(pList* pHead);//反转(逆序)链表--2
void BubbleSort(pList * pHead);//排序链表(冒泡)--3
void InsertFrontNode(pLinkNode pos, DataType x);// 在当前节点前插入一个数据x-----5
pLinkNode Merge(pList l1, pList l2);//合并两个有序列表-----6
pLinkNode FindMidNode(pList head);//查找链表的中间节点---7
void InitLinkList(pList* pHead)//初始化
{
assert(pHead);
*pHead = NULL;
}
pLinkNode buyNode(DataType x)//构造节点
{
pLinkNode newNode = (pLinkNode)malloc(sizeof(LinkNode));
newNode->data = x;
newNode->next = NULL;
return newNode;
}
void PushBack(pList* pHead, DataType x)//尾插
{
pLinkNode newNode;
pLinkNode cur = *pHead;
assert(pHead);
newNode = buyNode(x);
if(*pHead == NULL)
{
*pHead = newNode;
return;
}
else
{
while(cur->next)
{
cur = cur->next;
}
cur->next = newNode;
}
}
pLinkNode Find(pList head, DataType x)//查找某一节点
{
pLinkNode cur = head;
if(head == NULL)
{
printf("链表中无节点\n");
}
else
{
while(cur)
{
if(cur->data == x)
return cur;
cur = cur->next;
}
return NULL;
}
}
void PrintList(pList list)//打印
{
pList cur = list;
while(cur)
{
printf("%d ",cur->data);
cur = cur->next;
}
printf("over");
}
void EraseNotTail(pLinkNode pos)
{
DataType x;
pLinkNode del = NULL;
x = pos->data;
pos->data = pos->next->data;
pos->next->data = x;
del = pos->next;
pos->next = del->next;
free(del);
del = NULL;
}
void ReverseList(pList* pHead)//逆序
{
pLinkNode cur = *pHead;
pLinkNode prev = NULL;
pLinkNode newHead = NULL;
if(cur == NULL)
return;
if(cur->next == NULL)
return;
while(cur)
{
prev = cur;
cur = cur->next;
prev->next = newHead;
newHead = prev;
}
*pHead = newHead;
}
void BubbleSort(pList * pHead)//排序链表(冒泡)--3
{
pLinkNode cur = *pHead;
pLinkNode end = NULL;
DataType x;
assert(pHead);
while(cur != end)
{
while(cur&&cur->next!=end)
{
if(cur->data > cur->next->data)
{
x = cur->data;
cur->data = cur->next->data;
cur->next->data = x;
}
cur = cur->next;
}
end = cur;
cur = *pHead;
}
}
void InsertFrontNode(pLinkNode pos, DataType x)// 在当前节点前插入一个数据x-----5
{
pLinkNode newNode = buyNode(x);
DataType tmp;
assert(pos);
newNode->next = pos->next;
pos->next = newNode;
tmp = pos->data;
pos->data = newNode->data;
newNode->data = tmp;
}
pLinkNode Merge(pList l1, pList l2)//合并两个有序列表-----6
{
pList newHead = NULL;
pLinkNode cur = newHead;
if(l1 == l2)
{
return l1;
}
if(l1 == NULL && l2 != NULL)
{
return l2;
}
if(l1 !=NULL && l2 == NULL)
{
return l1;
}
if(l1->data < l2->data)
{
newHead = l1;
l1 = l1->next;
}
else
{
newHead = l2;
l2 = l2->next;
}
cur = newHead;
while(l1&&l2)
{
if(l1->data<l2->data)
{
cur->next = l1;
l1 = l1->next;
}
else
{
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
if(l1)
{
cur->next = l1;
}
else
{
cur->next = l2;
}
return newHead;
}
pLinkNode FindMidNode(pList head)//查找链表的中间节点---7
{
pLinkNode cur = head;
pLinkNode mid = head;
if(cur == NULL)
{
return NULL;
}
while(cur->next)
{
cur = cur->next->next;
mid = mid->next;
}
return mid;
}
#endif //__LINK_LIST_H__
“test.c”
#include "link.h"
void Test1()
{
pList mylist;
pLinkNode ret = NULL;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,4);
PushBack(&mylist,5);
ret = Find(mylist,2);
EraseNotTail(ret);
PrintList(mylist);
}
void Test2()
{
pList mylist;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,4);
PushBack(&mylist,2);
PushBack(&mylist,5);
PushBack(&mylist,3);
BubbleSort(&mylist);
PrintList(mylist);
}
void Test3()
{
pList mylist;
pLinkNode ret = NULL;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,4);
PushBack(&mylist,5);
ret = Find(mylist,4);
InsertFrontNode(ret,6);
PrintList(mylist);
}
void Test4()
{
pList mylist;
pLinkNode ret = NULL;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,4);
PushBack(&mylist,5);
ret = FindMidNode(mylist);
if(ret != NULL)
{
printf("%d ",ret->data);
}
}
void Test5()
{
pList l1;
pList l2;
pList ret = NULL;
InitLinkList(&l1);
InitLinkList(&l2);
PushBack(&l1,1);
PushBack(&l1,3);
PushBack(&l1,5);
PushBack(&l2,2);
PushBack(&l2,4);
PushBack(&l2,6);
ret = Merge(l1,l2);
PrintList(ret);
}
void Test6()
{
pList mylist;
InitLinkList(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,4);
PushBack(&mylist,5);
//PrintList(mylist);
ReverseList(&mylist);
PrintList(mylist);
}
int main()
{
Test6();
return 0;
}