如题;这是一套完整的可运行的代码;需要读者有一定的基础去阅读;
语言是用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;
}