單鏈表代碼實現

如題;這是一套完整的可運行的代碼;需要讀者有一定的基礎去閱讀;

語言是用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;
}

 

發佈了36 篇原創文章 · 獲贊 0 · 訪問量 4226
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章