如題;這是一套完整的可運行的代碼;需要讀者有一定的基礎去閱讀;
語言是用C語言實現;在C++環境中編寫;在C++中可直接運行;在C語言中需要改部分頭文件和輸出語句;
頭文件;這要是代碼的聲明部分;
# ifndef _LINKLIST_
# define _LINKLIST_
# include <iostream>
using namespace std;
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node * next;
}LNode, * LinkList;
LinkList Create_LinkList(void);
void Destroy_LinkList(LinkList * pH);
int Length_LinkList(LinkList H);
void Inversion_LinkList(LinkList * pH);
void Traversal_LinkList(LinkList H);
LinkList Search_LinkList_Pos(LinkList H, int i);
LinkList Search_LinkList_value(LinkList H, DataType x);
int Insert_LinkList_Pos(LinkList H, int i, DataType x);
int Push_LinkList(LinkList H, DataType x);
int Delete_LinkList_Pos(LinkList H, int i, int * val);
int Pop_LinkList(LinkList H, int * val);
void Sort_LinkList(LinkList H);
# endif
實現文件;
# include "LinkList.h"
LinkList Create_LinkList(void)
{
LinkList H = (LinkList)malloc(sizeof(LNode));
if (NULL != H)
{
H->next = NULL;
H->data = 0;
return H;
}
else
{
cout << "LinkList Create_LinkList(void): Memory allocate error! " << endl;
system("pause");
exit(0);
}
}
void Destroy_LinkList(LinkList * pH)
{
LinkList p = *pH;
LinkList q = NULL;
while (p)
{
q = p;
p = p->next;
free(q);
q = NULL;
}
*pH = NULL;
return;
}
int Length_LinkList(LinkList H)
{
LinkList p = H;
int cnt = 0;
while (p->next)
{
p = p->next;
cnt++;
}
return cnt;
}
void Inversion_LinkList(LinkList * pH)
{
int val = 0;
LinkList p = *pH;
LinkList q = Create_LinkList();
int len = Length_LinkList(p);
for (int i = 0; i < len; i++)
{
Pop_LinkList(p, &val);
Push_LinkList(q, val);
}
*pH = q;
return;
}
void Traversal_LinkList(LinkList H)
{
LinkList p = H;
while (p->next)
{
p = p->next;
cout << p->data << " ";
}
cout << endl;
return;
}
//這是鏈表操作最重要的操作,後面的插入刪除都要用到查找;
//這裏能避免三種異常情況;
//1、當傳進來的鏈表不存在時,直接返回NULL;
//2、當傳入要查找的序號大於鏈表的最大個數時, while-loop直到p == NULL;退出;
//3、當傳入的序號小於0時, 由於j > i 退出;
//三種請況有一種是極端的鏈表不存在;其他兩種本質都是序號不存在引起的;
//一個大於的鏈表元素個數;一個小於0, 當序號等於0時,返回頭指針變量;
//理解這個程序應該反向理解, 只有當數據傳遞正確是才能正確返回結果;否則要麼是序號錯誤要麼鏈表不存在;
LinkList Search_LinkList_Pos(LinkList H, int i)
{
LinkList p = H;
int j = 0;
while ((NULL != p) && (j < i))
{
p = p->next;
j++;
}
if ((NULL == p) || (j > i))//NULL == p是由於鏈表爲空或在序號大於鏈表最大個數;j > i 是由於序號小於0;
{
cout << "LinkList Search_LinkList_Pos(LinkList H, int i) : Forward list is not exit or Parameter is error! " << endl;
return NULL;
}
return p;
}
LinkList Search_LinkList_value(LinkList H, DataType x)
{
LinkList p = H->next;
while ((NULL != p) && (p->data != x))
{
p = p->next;
}
return p;
}
int Insert_LinkList_Pos(LinkList H, int i, DataType x)
{
LinkList p = Search_LinkList_Pos(H, i - 1);
if (NULL == p)
{
return -1;
}
LinkList q = (LinkList)malloc(sizeof(LNode));
if (NULL == q)
{
return -2;
}
q->data = x;
q->next = NULL;
q->next = p->next;
p->next = q;
return 0;
}
int Push_LinkList(LinkList H, DataType x)
{
LinkList p = H;
while (p->next)
{
p = p->next;
}
LinkList q = (LinkList)malloc(sizeof(LNode));
if (NULL == q)
{
return -1;
}
q->data = x;
q->next = NULL;
p->next = q;
return 0;
}
int Delete_LinkList_Pos(LinkList H, int i, int * val)
{
//沒有這個if判斷也可以;但是這要提前判斷可以提高效率;判斷表不存在主要是呼應Insert()可以處理表不存在;
if (NULL == H || NULL == H->next)
{
return -1;
}
LinkList p = Search_LinkList_Pos(H, i - 1);
if (NULL == p || NULL == p->next)//判斷p->next == NULL主要是刪除的不能是最後一個元素的下一個元素;
{
return -2;
}
LinkList q = p->next;
p->next = q->next;
*val = q->data;
free(q);
q = NULL;
return 0;
}
int Pop_LinkList(LinkList H, int * val)
{
if (NULL == H->next)
{
return -1;
}
LinkList p = H;
while (p->next->next)
{
p = p->next;
}
LinkList q = p->next;
p->next = NULL;
*val = q->data;
free(q);
q = NULL;
return 0;
}
void Sort_LinkList(LinkList H)
{
LinkList p = H->next;
int len = Length_LinkList(H);
if (len < 0)
{
return;
}
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (p->data > p->next->data)
{
int tem = p->data;
p->data = p->next->data;
p->next->data = tem;
}
p = p->next;
}
p = H->next;
}
return;
}
Main函數;
# include "LinkList.h"
int main(int argc, char ** argv)
{
int val = 0;
LinkList H = Create_LinkList();
Push_LinkList(H, 3);
Push_LinkList(H, 8);
Push_LinkList(H, 2);
Push_LinkList(H, 20);
Push_LinkList(H, 38);
Push_LinkList(H, 16);
Push_LinkList(H, 25);
Push_LinkList(H, 33);
Push_LinkList(H, 120);
Push_LinkList(H, 60);
Traversal_LinkList(H);
Inversion_LinkList(&H);;
Traversal_LinkList(H);
system("pause");
return 0;
}