重溫《大話數據結構》筆記一 單鏈錶鏈式存儲結構的操作代碼

#include <iostream>
#include <string>
using namespace std;


typedef int ElemType;
//單鏈表的鏈式存儲結構
typedef struct Node{
	ElemType data;  //數據域
	Node *next;  //指針域
}Node;
typedef Node* LinkList;

//線性表的類型操作(operation)
void InitList(LinkList *L);  //初始化操作,創建一個空的線性表L
bool ListEmpty(LinkList L);  //判斷線性表是否爲空,是則返回true,否則返回false
void ClearList(LinkList *L);  //將線性表清空
bool GetElem(LinkList L, int index, ElemType *returnVal);  //將線性表L中的第index位置的元素值返回給returnVal
bool LocateElem(LinkList L, ElemType val);  //查找線性表L中是否有與val值相等的元素
bool ListInsert(LinkList *L, int index, ElemType insertVal);  //在線性表的第index位置插入元素insertVal
bool ListDelete(LinkList *L, int index, ElemType *returnVal);  //刪除線性表L中第index位置的元素,將刪除元素返回給returnVal
size_t ListLenght(LinkList L);  //返回線性表L的元素個數

//初始化操作,創建一個空的線性表L
void InitList(LinkList *L)
{
	*L = new Node;  //new一個Node結點,爲頭結點
	(*L)->data = 0;  //頭結點的數據域存放的是線性表的長度(這樣ListLength函數可以直接訪問頭結點即可)
	(*L)->next = NULL;  //頭指針的指針域爲NULL
}

//判斷線性表是否爲空,是則返回true,否則返回false
bool ListEmpty(LinkList L)
{
	if(L->next == NULL)  //如果頭結點的指針域爲空,則線性表爲空
		return true;
	return false;  //否則線性表不爲空
	/*方法二:訪問頭結點數據域
	if(L->data == 0)
		return true;
	return false;
	*/
}

//將線性表清空
void ClearList(LinkList *L)
{
	(*L)->next = NULL;
	(*L)->data = 0;
}

//在線性表的第index位置插入元素insertVal
bool ListInsert(LinkList *L, int index, ElemType insertVal)
{
	LinkList ptr = *L;
	int tracker = 1;
	while(ptr && tracker < index)
	{
		ptr = ptr->next;
		++tracker;
	}
	if(!ptr || tracker > index)
		return false;
	LinkList newNode = new Node;
	newNode->data = insertVal;
	newNode->next = ptr->next;
	ptr->next = newNode;
	(*L)->data = (*L)->data + 1;  //頭結點數據域增1
	return true;
}

//返回線性表L的元素個數
size_t ListLenght(LinkList L)
{
	return L->data;
	/*方法二:迭代計算
	*/
}

//將線性表L中的第index位置的元素值返回給returnVal
bool GetElem(LinkList L, int index, ElemType *returnVal)
{
	LinkList ptr = L->next;
	int tracker = 1;  //ptr指向第tracker個元素
	while(ptr && tracker < index)
	{
		ptr = ptr->next;
		++tracker;
	}
	if(!ptr || tracker > index)
		return false;
	*returnVal = ptr->data;
	return true;
}

//刪除線性表L中第index位置的元素,將刪除元素返回給returnVal
bool ListDelete(LinkList *L, int index, ElemType *returnVal)
{
	LinkList ptr = *L;
	int tracker = 1;
	while(ptr->next && tracker < index)
	{
		ptr = ptr->next;
		++tracker;
	}
	if(!(ptr->next) || tracker > index)
		return false;
	LinkList deleteNode = ptr->next;
	*returnVal = deleteNode->data;
	ptr->next = deleteNode->next;
	delete deleteNode;
	(*L)->data = (*L)->data - 1;
	return true;
}

//查找線性表L中是否有與val值相等的元素
bool LocateElem(LinkList L, ElemType val)
{
	LinkList ptr = L->next;
	int tracker = 1;
	while(ptr)
	{
		if(ptr->data == val)
			return true;
		ptr = ptr->next;
	}
	if(!ptr)
		return false;  //如果已經到達了結尾
}

void main()
{
	LinkList L;
	InitList(&L);
	cout<<ListEmpty(L)<<endl;

	for(int i = 1; i <= 10; ++i)
		ListInsert(&L, i, i);

	cout<<ListEmpty(L)<<endl;
	cout<<"線性表的元素個數爲: "<<ListLenght(L)<<endl;

	cout<<"線性表的全部元素如下: "<<endl;
	ElemType returnVal;
	for(int i = 1; i <= 10; ++i)
	{
		GetElem(L, i, &returnVal);
		cout<<returnVal<<"  ";
	}
	cout<<endl;

	
	cout<<"是否存在元素值爲11? "<<LocateElem(L, 11)<<endl;

	ListDelete(&L, 5, &returnVal);
	for(size_t i = 1; i <= ListLenght(L); ++i)
	{
		GetElem(L, i, &returnVal);
		cout<<returnVal<<"  ";
	}
	cout<<endl;

	system("pause");
}

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