数据结构-链表相关操作函数(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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章