《C语言》单链表——增、删、查、改、销毁、排序、翻转、合并、取中间节点...
Main.c
#include "SingleList.h"
#include <time.h>
#define N 10
void main()
{
#if 0
SingleList* P_Head = NULL;
for(int i=0;i<N;i++)
{
PushBack(&P_Head, i);
}
Show(P_Head);
#endif
#if 0
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushHead(&P_Head, i);
}
Show(P_Head);
#endif
#if 0
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushBack(&P_Head, i);
}
Show(P_Head);
if (NULL != FindNode(P_Head, 0) && NULL != FindNode(P_Head, 5) && NULL != FindNode(P_Head, 9))
{
puts("Find");
}
else
{
puts("Can't found!");
}
#endif
#if 0
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushBack(&P_Head, i);
}
Show(P_Head);
InsertNode(&P_Head, 0, 100);
InsertNode(&P_Head, 5, 100);
InsertNode(&P_Head, 9, 100);
Show(P_Head);
#endif
#if 0
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushBack(&P_Head, i);
}
Show(P_Head);
DeleteNode(&P_Head, 0);
DeleteNode(&P_Head, 5);
DeleteNode(&P_Head, 9);
Show(P_Head);
#endif
#if 0
SingleList* P_Head = NULL;
for (int i = 0; i < N*N; i++)
{
PushBack(&P_Head, i);
}
Show(P_Head);
printf("该链表合计\t%u\t个节点\n", CounterNode(P_Head));
#endif
#if 0
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushBack(&P_Head, i);
}
Show(P_Head);
Modification(P_Head, 0, 100);
Modification(P_Head, 5, 100);
Modification(P_Head, 9, 100);
Show(P_Head);
#endif
#if 0
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushBack(&P_Head, i);
}
Show(P_Head);
printf("中间节点:%d\n",(GetMiddleNode(P_Head))->Data);
#endif
#if 0
SingleList* P_All=NULL;
SingleList* P_Head1 = NULL;
SingleList* P_Head2 = NULL;
for (int i = 0; i <10; i++)
{
if (i % 2)
{
PushBack(&P_Head2, i);
}
else
{
PushBack(&P_Head1, i);
}
}
Show(P_Head1);
Show(P_Head2);
Merge(&P_All, P_Head1, P_Head2);
Show(P_All);
#endif
#if 0
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushBack(&P_Head, i);
}
Show(P_Head);
Destory(&P_Head);
Show(P_Head);
#endif
#if 0
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushBack(&P_Head, i);
}
Show(P_Head);
ReversalByLoop(&P_Head);
Show(P_Head);
#endif
#if 0
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushBack(&P_Head, i);
}
Show(P_Head);
P_Head= ReversalByRecursion(P_Head);
Show(P_Head);
#endif
#if 0
srand((unsigned int)time(NULL));
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushBack(&P_Head, rand()%100);
}
Show(P_Head);
BubbleSort(P_Head);
Show(P_Head);
#endif
#if 0
srand((unsigned int)time(NULL));
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushBack(&P_Head, rand() % 100);
}
Show(P_Head);
QuickSort(P_Head,NULL);
Show(P_Head);
#endif
#if 1
srand((unsigned int)time(NULL));
SingleList* P_Head = NULL;
for (int i = 0; i < N; i++)
{
PushBack(&P_Head, rand() % 100);
}
Show(P_Head);
SelectSort(P_Head);
Show(P_Head);
#endif
system("pause");
}
SingleList.h
#pragma once
#ifdef __cplusplus
extern"C"
{
#endif
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct SingleList
{
DataType Data;
struct SingleList* P_Next;
}SingleList;
void Show(SingleList* P_Head);
void InitNode(SingleList* P_Node, DataType Data);
void Swap(SingleList* Pa, SingleList* Pb);
SingleList* Segmentaction(SingleList* P_Begin, SingleList* P_End);
void PushBack(SingleList** PP_Head, DataType Data);
void PushHead(SingleList** PP_Head,DataType Data);
SingleList* FindNode(SingleList* P_Head, DataType FindData);
void InsertNode(SingleList** PP_Head, DataType Rear, DataType InsData);
void DeleteNode(SingleList** PP_Head, DataType Data);
void Modification(SingleList* P_Head, DataType OldData, DataType NewData);
unsigned int CounterNode(SingleList*P_Head);
SingleList* GetMiddleNode(SingleList* P_Head);
void Merge(SingleList** PP_ALL, SingleList* P_Head1, SingleList* P_Head2);
void Destory(SingleList** PP_Head);
void ReversalByLoop(SingleList** PP_Head);
SingleList* ReversalByRecursion(SingleList* P_Head);
void BubbleSort(SingleList* P_Head);
void QuickSort(SingleList* P_Begin, SingleList* P_End);
void SelectSort(SingleList* P_Head);
#ifdef __cplusplus
}
#endif
SingleList.c
#include "SingleList.h"
void Show(SingleList* P_Head)
{
if (NULL == P_Head)
{
puts("");
return;
}
else
{
printf("%p\t%p\t%d\n",P_Head,P_Head->P_Next,P_Head->Data);
Show(P_Head->P_Next);
}
}
void InitNode(SingleList* P_Node, DataType Data)
{
P_Node->P_Next = NULL;
P_Node->Data = Data;
}
void Swap(SingleList* Pa, SingleList* Pb)
{
DataType Temp = Pa->Data;
Pa->Data = Pb->Data;
Pb->Data = Temp;
}
SingleList* Segmentaction(SingleList* P_Begin, SingleList* P_End)
{
DataType Key = P_Begin->Data;
SingleList* Pi = P_Begin;
for (SingleList* Pj = Pi->P_Next; Pj != P_End; Pj = Pj->P_Next)
{
if (Key < Pj->Data)
{
Pi = Pi->P_Next;
Swap(Pi, Pj);
}
}
Swap(Pi, P_Begin);
return Pi;
}
void PushBack(SingleList** PP_Head, DataType Data)
{
if (NULL == *PP_Head)
{
SingleList* P_New=(SingleList*)malloc(sizeof(SingleList));
InitNode(P_New, Data);
*PP_Head = P_New;
}
else
{
SingleList* P_New = (SingleList*)malloc(sizeof(SingleList));
InitNode(P_New, Data);
SingleList* P_Bak = *PP_Head;
while (NULL != P_Bak->P_Next)
{
P_Bak = P_Bak->P_Next;
}
P_Bak->P_Next = P_New;
}
}
void PushHead(SingleList** PP_Head, DataType Data)
{
if (NULL == *PP_Head)
{
SingleList* P_New = (SingleList*)malloc(sizeof(SingleList));
InitNode(P_New, Data);
*PP_Head = P_New;
}
else
{
SingleList* P_New = (SingleList*)malloc(sizeof(SingleList));
InitNode(P_New, Data);
P_New->P_Next = *PP_Head;
*PP_Head = P_New;
}
}
SingleList* FindNode(SingleList* P_Head, DataType FindData)
{
while (NULL != P_Head)
{
if (FindData == P_Head->Data)
{
return P_Head;
}
P_Head = P_Head->P_Next;
}
return NULL;
}
void InsertNode(SingleList** PP_Head, DataType Rear, DataType InsData)
{
SingleList* P_Res = FindNode(*PP_Head, Rear);
if (NULL == P_Res)
{
return;
}
else
{
SingleList* P_New = (SingleList*)malloc(sizeof(SingleList));
InitNode(P_New, InsData);
if(NULL == P_Res->P_Next)
{
P_Res->P_Next = P_New;
}
else
{
P_New->P_Next = P_Res->P_Next;
P_Res->P_Next = P_New;
}
}
}
void DeleteNode(SingleList** PP_Head, DataType Data)
{
SingleList* P_Res = FindNode(*PP_Head, Data);
if (NULL == P_Res)
{
return;
}
else
{
if (P_Res == *PP_Head)
{
*PP_Head = (*PP_Head)->P_Next;
free(P_Res);
P_Res = NULL;
}
else
{
SingleList* P_Bak = *PP_Head;
while (P_Bak->P_Next!=P_Res)
{
P_Bak = P_Bak->P_Next;
}
P_Bak->P_Next = P_Res->P_Next;
free(P_Res);
P_Res = NULL;
}
}
}
void Modification(SingleList* P_Head, DataType OldData, DataType NewData)
{
SingleList* P_Res = FindNode(P_Head,OldData);
if (NULL == P_Res)
{
return;
}
else
{
P_Res->Data = NewData;
}
}
unsigned int CounterNode(SingleList*P_Head)
{
if (NULL == P_Head)
{
return 0;
}
return 1 + CounterNode(P_Head->P_Next);
}
SingleList* GetMiddleNode(SingleList* P_Head)
{
if (NULL == P_Head || NULL == P_Head->P_Next)
{
return P_Head;
}
SingleList* Pi=P_Head;
SingleList* Pj=P_Head;
while (NULL != Pi->P_Next)
{
Pi = Pi->P_Next;
Pj = Pj->P_Next;
if (NULL != Pi->P_Next)
{
Pi = Pi->P_Next;
}
}
return Pj;
}
void Merge(SingleList** PP_ALL, SingleList* P_Head1, SingleList* P_Head2)
{
while (NULL != P_Head1 || NULL != P_Head2)
{
if (NULL != P_Head1 && NULL != P_Head2)
{
if (P_Head1->Data < P_Head2->Data)
{
PushBack(PP_ALL, P_Head1->Data);
P_Head1 = P_Head1->P_Next;
}
else
{
PushBack(PP_ALL, P_Head2->Data);
P_Head2 = P_Head2->P_Next;
}
}
else
{
while (NULL != P_Head1)
{
PushBack(PP_ALL, P_Head1->Data);
P_Head1 = P_Head1->P_Next;
}
while (NULL != P_Head1)
{
PushBack(PP_ALL, P_Head2->Data);
P_Head2 = P_Head2->P_Next;
}
break;
}
}
}
void Destory(SingleList** PP_Head)
{
while (*PP_Head != NULL)
{
SingleList* Pi = *PP_Head;
*PP_Head = (*PP_Head)->P_Next;
if (NULL == *PP_Head)
{
break;
}
free(Pi);
Pi = NULL;
}
}
void ReversalByLoop(SingleList** PP_Head)
{
if (NULL == *PP_Head || NULL == (*PP_Head)->P_Next)
{
return;
}
else
{
SingleList* P_Pre, *P_Cur, *P_Next;
P_Pre=P_Cur=P_Next= NULL;
P_Pre = *PP_Head;
P_Cur = (*PP_Head)->P_Next;
while (NULL != P_Cur)
{
P_Next = P_Cur->P_Next;
P_Cur->P_Next = P_Pre;
P_Pre = P_Cur;
P_Cur = P_Next;
}
(*PP_Head)->P_Next= NULL;
*PP_Head = P_Pre;
}
}
SingleList* ReversalByRecursion(SingleList* P_Head)
{
if (NULL == P_Head || NULL == P_Head->P_Next)
{
return P_Head;
}
else
{
SingleList* P_Next = P_Head->P_Next;
SingleList* P_NewHead = ReversalByRecursion(P_Next);
P_Next->P_Next = P_Head;
P_Head->P_Next = NULL;
return P_NewHead;
}
}
void BubbleSort(SingleList* P_Head)
{
for (SingleList* Pi = P_Head; NULL != Pi; Pi = Pi->P_Next)
{
for (SingleList* Pj = Pi->P_Next; NULL != Pj; Pj = Pj->P_Next)
{
if (Pi->Data < Pj->Data)
{
Swap(Pi,Pj);
}
}
}
}
void QuickSort(SingleList* P_Begin, SingleList* P_End)
{
if (P_Begin != P_End)
{
SingleList* Pi = Segmentaction(P_Begin, P_End);
QuickSort(P_Begin, Pi);
QuickSort(Pi->P_Next, P_End);
}
}
void SelectSort(SingleList* P_Head)
{
SingleList* P_Limit = NULL;
for (SingleList* Pi = P_Head; NULL != Pi; Pi = Pi->P_Next)
{
P_Limit = Pi;
for (SingleList* Pj = Pi->P_Next; NULL != Pj; Pj = Pj->P_Next)
{
if (P_Limit->Data < Pj->Data)
{
P_Limit = Pj;
P_Limit = Pj;
}
}
Swap(P_Limit, Pi);
}
}