帶頭節點的雙循環鏈表

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

語言是用C語言實現;在C++環境中編寫;在C++中可直接運行;在C語言中需要改部分頭文件和輸出語句;

頭文件;這要是代碼的聲明部分;

# ifndef _LINKLIST_
# define _LINKLIST_

# include <iostream>
using namespace std;

typedef int DataType;

typedef struct Node
{
	DataType data;
	struct Node * next;
	struct Node * prior;
}LNode, *LinkList;

LinkList CreateLinkList(void);
void DestroyLinkList(LinkList * pH);
int LengthLinkList(LinkList H);
void TraversalLinkList(LinkList H);

LinkList SearchLinkListPos(LinkList H, int pos);
LinkList SearchLinkListValue(LinkList H, DataType x);
int InsertLinkListPos(LinkList H, int pos, DataType x);
int DeleteLinkListPos(LinkList H, int pos, int * val);

# endif

實現文件;主要是代碼的實現;

# include "Head.h"

LinkList CreateLinkList(void)
{
	LinkList H = (LinkList)malloc(sizeof(LNode));

	if (NULL != H)
	{
		H->data = 0;
		H->prior = H;
		H->next = H;

		return H;
	}
	else
	{
		cout << "Memory allocate is error! " << endl;
		system("pause");
		exit(0);
	}
}

void DestroyLinkList(LinkList * pH)
{
	LinkList H = *pH;

	if (H == H->next)
	{
		free(H);
		H = NULL;

		*pH = NULL;
		return;
	}

	LinkList p = H->next;
	LinkList q = NULL;

	while (p != H)
	{
		q = p;
		p = p->next;
		free(q);
		q = NULL;
	}

	free(H);
	H = NULL;

	*pH = NULL;
	return;
}

int LengthLinkList(LinkList H)
{
	if (H == H->next)
	{
		return 0;
	}

	LinkList p = H->next;
	int cnt = 0;

	while (p != H)
	{
		p = p->next;
		cnt++;
	}

	return cnt;
}

void TraversalLinkList(LinkList H)
{
	if (H == H->next)
	{
		return;
	}

	LinkList p = H->next;

	while (p != H)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;

	return;
}

LinkList SearchLinkListPos(LinkList H, int pos)
{
	if (0 == pos)
	{
		return H;
	}

	LinkList p = H->next;

	int i = 0;
	while ((p != H) && (i < pos - 1))
	{
		p = p->next;
		i++;
	}

	if ((p == H) || (i > pos - 1))
	{
		cout << "LinkList is not exit or parameter error! " << endl;
		return NULL;
	}

	return p;
}

LinkList SearchLinkListValue(LinkList H, DataType x)
{
	if (H == H->next)
	{
		return NULL;
	}

	LinkList p = H->next;

	while ((p != H) && (p->data != x))
	{
		p = p->next;
	}

	if (p == H)
	{
		return NULL;
	}
	else
	{
		return p;
	}
}

int InsertLinkListPos(LinkList H, int pos, DataType x)
{
	LinkList p = SearchLinkListPos(H, pos - 1);
	if (NULL == p)
	{
		return -1;
	}

	LinkList q = (LinkList)malloc(sizeof(LNode));
	q->data = x;

	q->next = p->next;
	p->next->prior = q;
	p->next = q;
	q->prior = p;

	return 0;
}

int DeleteLinkListPos(LinkList H, int pos, int * val)
{
	if ((H == NULL) || (H == H->next))
	{
		return -1;
	}

	LinkList p = SearchLinkListPos(H, pos - 1);
	if ((NULL == p) || (p->next == H))
	{
		return -2;
	}

	*val = p->next->data;

	LinkList q = p->next;
	p->next = q->next;
	q->prior = p;
	free(q);
	q = NULL;

	return 0;
}

Main函數;

# include "Head.h"

int main(int argc, char ** argv)
{
	int val = 0;
	LinkList H = CreateLinkList();
	for (int i = 0; i < 10; i++)
	{
		InsertLinkListPos(H, i + 1, i + 1);
	}

	TraversalLinkList(H);
	LinkList p = H->prior;
	cout << p->data << endl;

	while (p != H)
	{
		cout << p->data << " ";
		p = p->prior;
	}
	cout << endl;

	//LinkList p = H;
	//while (p->next != H)
	//{
	//	p = p->next;
	//}

	//cout << p->data << endl;
	//p = p->next->next;
	//cout << p->data << endl;

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