數據結構-鏈表相關操作函數(C++語言實現)

鏈表是一種常見的基礎數據結構,結構體指針在這裏得到了充分的利用。鏈表可以動態的進行存儲分配,也就是說,鏈表是一個功能極爲強大的數組,他可以在節點中定義多種數據類型,還可以根據需要隨意增添,刪除,插入節點。鏈表都有一個頭指針,一般以head來表示,存放的是一個地址。鏈表中的節點分爲兩類,頭結點和一般節點,頭結點是沒有數據域的。鏈表中每個節點都分爲兩部分,一個數據域,一個是指針域。說到這裏你應該就明白了,鏈表就如同車鏈子一樣,head指向第一個元素:第一個元素又指向第二個元素;……,直到最後一個元素,該元素不再指向其它元素,它稱爲“表尾”,它的地址部分放一個“NULL”(表示“空地址”),鏈表到此結束。

#include<iostream>
using namespace std;

typedef struct Node{
	int data;
	struct Node* pNext;
}NODE,*PNODE;

//創建鏈表函數
PNODE create_list(int len) {
	PNODE phead = new NODE;
	if (phead == NULL) {
		exit(-1);
	}
	PNODE ptail = phead;
	ptail->pNext = NULL;
	cout << "請輸入存儲數據:" << endl;
	for (int i = 0; i < len; i++) {
		int a;
		cin >> a;
		PNODE pnew = new NODE;
		if (NULL == pnew) {
			exit(-1);
		}
		pnew->data = a;
		ptail->pNext = pnew;
		pnew->pNext = NULL;
		ptail = pnew;
	}
	return phead;
}
//求鏈表的長度函數
int length_list(PNODE phead) {
	PNODE p = phead->pNext;
	int len = 0;
	while (p != NULL) {
		p = p->pNext;
		len++;
	}
	return len;
}
//遍歷鏈表函數
void traverse_list(PNODE phead) {
	PNODE p = phead->pNext;
	while (p != NULL) {
		cout << p->data<<" ";
		p = p->pNext;
	}
	cout << endl;
}
//鏈表排序函數
void sort_list(PNODE phead) {
	int len = length_list(phead);
	PNODE p,q;
	int i, j;
	for (p= phead->pNext, i = 0, p; i < len - 1; i++, p=p->pNext) {
		for (j = 0, q = p->pNext; j < len - i - 1; q = q->pNext, j++) {
			if (p->data > q->data) {
				int temp = p->data;
				p->data = q->data;
				q->data = temp;
			}
		}
	}
	cout << endl;
}
//鏈表中插入數據函數
bool insert_list(PNODE phead, int pos, int val) {
	PNODE p = phead;
	int i = 0;
	while (p != NULL && i < pos - 1) {
		p = p->pNext;
		i++;
	}
	if (p == NULL) {
		return false;
	}
	PNODE pnew = new NODE;
	if (pnew == NULL) {
		cout << "動態內存分配失敗" << endl;
		exit(-1);
	}
	pnew->data = val;
	PNODE q = p->pNext;
	p->pNext=pnew;
	pnew->pNext = q;
	return true;
}
//鏈表中刪除數據函數
bool delete_list(PNODE phead, int pos, int *val) {
	PNODE p = phead;
	int i = 0;
	while (p != NULL && i < pos - 1) {
		p = p->pNext;
		i++;
	}
	if (p == NULL) {
		return false;
	}
	PNODE q = p->pNext;
	*val = q->data;
	p->pNext = q->pNext;
	delete q;
	return true;
}
int main() {
	int len;
	cout << "輸入構建鏈表的長度;" << endl;
	cin >> len;
	PNODE p = create_list(len);
	cout << "您構建的鏈表爲:"<< endl;
	traverse_list(p);
	int l = length_list(p);
	//cout << "您構建的鏈表長度爲:" <<l<< endl;
	sort_list(p);
	cout << "排序後的鏈表爲:" << endl;
	traverse_list(p);
	insert_list(p, 5, 0);
	cout << "在第五個位置插入數據0後的鏈表爲:" << endl;
	traverse_list(p);
	int val;
	delete_list(p, 2, &val);
	cout << "刪除第二個位置的數據後的鏈表爲:" << endl;
	cout << "刪除第二個位置的數據爲:" << val<<endl;
	traverse_list(p);
	sort_list(p);
	cout << "重新對該鏈表進行排序得到鏈表爲:" << endl;
	traverse_list(p);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章