1. 程式人生 > 實用技巧 >資料結構--順序表和單鏈表c++

資料結構--順序表和單鏈表c++

順序表

#include <iostream>
using namespace std;

constexpr auto MAXSIZE = 100;
constexpr auto ERROR = 0;
constexpr auto OK = 1;
typedef int ElemType;

//順序表的儲存結構
typedef struct
{
	ElemType* elem;
	int length;
}SqList;

//構造一個空的順序表
int InitList(SqList &L)
{
	//申請MAXSIZE個ElemType型變數空間,整型指標L.elem指向該地址空間開始處
	L.elem = new ElemType[MAXSIZE];
	if (!L.elem) exit(OVERFLOW);
	L.length = 0;
	return OK;
}

//取值--通過e返回第i個元素的傳值
int GetElem(SqList L, int i, ElemType& e)
{
	if (i<1 || i>L.length) return ERROR;	//判斷i值是否合理
	e = L.elem[i - 1];	//elem[i-1]單元儲存第i個數據元素
	return OK;
}
//查詢--在順序表L中查詢值為e的資料元素,返回其序號
int LocateElem(SqList L, ElemType e)
{
	for (int i = 0; i < L.length; i++)
	{
		if (L.elem[i] == e) return i + 1;	//查詢成功,返回序號i+1
	}
	return 0;	//查詢失敗,返回0
}
//插入--在順序表L中第i個位置插入新的元素e,i值的合法範圍是1<=i<=L.length+1
int ListInsert(SqList& L, int i, ElemType e)
{
	if ((i < 1) || (i > L.length + 1)) return ERROR;	//i值不合法
	if (L.length == MAXSIZE) return ERROR;	//當前儲存空間已滿
	for (int j = L.length - 1; j >= i; j--)
		L.elem[j + 1] = L.elem[j];
	L.elem[i - 1] = e;
	++L.length;
	return OK;
}
//刪除--在順序表刪除第i個元素,i值的合法範圍是1<=i<=i.length
int ListDelete(SqList& L, int i)
{
	if ((i < 1) || (i > L.length)) return ERROR;
	for (int j = 0; j <= L.length - 1; j++)
		L.elem[j - 1] = L.elem[j];
	--L.length;
	return OK;
}


int main()
{
	SqList L;
	ElemType e;
	int i;
	//順序表的初始化方法測試
	if (InitList(L) == 1) 
	{
		cout << "順序表初始化成功" << endl;
		cout << "當前順序表長度: " << L.length << endl;
	}
	//為方便測試其他方法,將順序表L初始化賦值一些資料
	int num[] = { 12,13,21,24,28,30,42,77 };
	for (int n = 0; n < sizeof(num) / sizeof(num[0]); n++)
	{
		L.elem[n] = num[n];
		L.length++;
	}
	cout << "賦值完成,當前順序表長度: " << L.length << endl;
	//測試順序表的取值--返回第3個元素的值到e
	if (GetElem(L, 3, e)) cout << "第3個元素的值是: " << e << endl;
	//測試順序表的查詢--查詢元素24的位置並返回
	if (int index = LocateElem(L, 24)) { cout << "24的序號是: " << index << endl; }
	else cout << "元素查詢失敗!" << endl;
	//測試順序表的插入--在第5個位置插入25
	if (ListInsert(L, 5, 25)) cout << "插入後第5個位置為: " << L.elem[4] << endl;
	//測試順序表的刪除--刪除第4個元素
	if (ListDelete(L, 4)) cout << "刪除成功!" << endl;
}

單鏈表

#include <iostream>
using namespace std;

constexpr auto ERROR = 0;
constexpr auto OK = 1;
typedef int ElemType;

//單鏈表的儲存結構
typedef struct LNode
{
	ElemType data;
	struct LNode* next;	//結點的指標域
}LNode, * LinkList;	//LinkList為指向結構體LNode的指標型別

//構造一個空的單鏈表L
int InitList(LinkList& L)
{
	L = new LNode;	//生成新的結點為頭結點,用頭指標L指向頭結點
	L->next = NULL;		//頭結點指標域為空
	return OK;
}

//建立單鏈表--(前插法)逆位序輸入n個元素的值,建立帶表頭結點的單鏈表
void CreateList_H(LinkList& L, int n) {
	L = new LNode;
	L->next = NULL;		//建立一個帶有頭結點的單鏈表
	LinkList p;
	for (int i = n; i > 0; i--) {
		p = new LNode;
		cin >> p->data;
		p->next = L->next;
		L->next = p;
	}

}
//建立單鏈表--(後插法)正位序輸入n個元素的值,建立帶表頭結點的單鏈表
void CreateList_R(LinkList& L, int n) {
	L = new LNode;
	L->next = NULL;		//建立一個帶有頭結點的單鏈表
	LinkList r = L;		//尾指標r指向頭結點
	LinkList p;
	for (int i = 0; i < n; ++i) {
		p = new LNode;
		cin >> p->data;
		p->next = NULL;
		r->next = p;	//r=上一個,所以將上一個結點next指向新建的p
		r = p;		//r指向新的尾結點*p
	}

}

//插入--在帶有頭結點的單鏈表L中第i個位置插入值為e的新節點
int ListInsert(LinkList& L, int i, int e) {
	LinkList p = L;
	int j = 0;
	//查詢第i-1個結點,指向該結點
	while (p && j < i - 1) {
		p = p->next;	
		j++;
	}
	if (p == NULL || j < i - 1) return ERROR;//檢查插入位置是否合法
	LinkList s;
	s = new LNode;
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}

//刪除位置i上的元素,並由e返回刪除的元素 
int ListDelete(LinkList& L, int i) {
	LinkList p = L, q;
	int j = 0;
	while (p->next && i - 1 > j) {//查詢第i-1個結點,指向該結點
		p = p->next;
		j++;
	}
	if (!(p->next) || j > i - 1) return ERROR;	//刪除位置不合法
	q = p->next;
	p->next = q->next;		//改變刪除結點前驅結點的指標域
	delete q;	//釋放空間q
	return OK;
}

//取值--在帶有頭結點的單鏈表L中根據序號i通過e返回第i個數據
int GetElem(LinkList L, int i, ElemType& e) {
	LinkList  p;
	p = L->next;
	int j = 1;
	while (p && j < i) {
		p = p->next;
		j++;
	}
	if (!p || j > i) return ERROR;
	e = p->data;
	return OK;
}

//查詢--在帶有頭結點的單鏈表L中查詢值為e的元素
LNode* LocateElem(LinkList L, ElemType e)
{
	LinkList p = L->next;	//初始化p指向首元結點
	while (p != NULL && p->data != e)
	{
		p = p->next;
	}
	return p;	//查詢成功返回為e的結點地址p,失敗則p為NULL
}

//方便測試輸入單鏈表
void printLinklist(LinkList L) {
	LinkList p;
	p = L->next;
	while (p != NULL) {
		cout << p->data << " ";
		p = p->next;
	}
}

int main()
{
	LinkList L;
	CreateList_H(L, 3);//建立一個長度為3的單鏈表
	printLinklist(L);
	cout << endl;

	ListInsert(L, 2, 8);//向第二個位置插入8
	printLinklist(L);
	cout << endl;

	ListDelete(L, 1);//刪除第一個位置的元素
	printLinklist(L);
	cout << endl;

	ElemType e;
	GetElem(L, 2, e);	cout << e << endl;
	cout << LocateElem(L, 12);
	return 0;

}