线性表-链式存储的基本操作

本文详细介绍了链表数据结构的基本操作实现,包括初始化、添加、删除、查找等关键功能,并探讨了链表排序的一种可能方法。通过代码示例,读者可以深入理解链表的内部运作及如何在实际应用中进行有效操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链表的基本操作

初始化,添加,删除,排序
#include <iostream>
using namespace std;

//类
struct Data {
	Data* data;

	int a;

	Data* next;

	Data() :data(NULL), next(NULL){}
};
//链表的基本操作

struct List {
	Data* head;
	//Operation
	Data* InitList();	//初始化
	
	bool ListEmpty();	//空?

	void ClearList();	//清空

	Data GetElem(int k);	//查找Data

	//int LocateElem(const Data& tar); //根据某一属性找该结点其它属性

	//void ListInsert(const Data& data/*,int loc*/);	//插入

	void ListDelete(int tar);	//删除

	int ListLength();	//长度

};

Data* List::InitList() {
	head = new Data();
	return head;
}
//Add 添加
void List::ListInsert(const Data& tar) {
	Data* p1 = new Data();
	//寻找尾巴 作前继
	Data* t = head;
	while (t->next != nullptr) {		// n(n+1)/2
		t = t->next;
	}
	t->next = p1;

	//添加*****************自行添加:同时将Data* data改成所有数据,如:学号《-》姓名
	p1->data = tar.data;

	
	//后继NULL
	p1->next = nullptr;
}

bool List::ListEmpty() {
	return head == nullptr ? false : true;
}

void List::ClearList() {
	Data* p1 = head;
	Data* p2;
	while (p1->next != nullptr) {
		p2 = p1->next;
		delete p1;
		p1 = p2;
	}
	head = nullptr;
}

void List::ListDelete(int tar) {
	Data* t = head;

	bool flag(true);
	while (flag) {
		if (t->next->a == tar)
			flag = false;
		else
			t = t->next;
	}
	//跳过目标节点
	t->next = t->next->next;

	if (t != nullptr)
		delete t->next;
}

int List::ListLength() {
	int num(0);
	Data* h = head;
	while (h->next != nullptr) {
		++num;
		h = h->next;
	}
	return num;
}

Data List::GetElem(int k) {
	bool flag(0);
	Data* t = head;
	while (t->next != nullptr){
		t = t->next;
		if (t->a == k){
			flag = 1;
			break;
		}
	}
	Data& ret = *t;
	Data error;
	return flag ? ret : error;
}

上述代码也没测试过,有个大概的模板,在遇到链表类编程的时候可以提供个大概思路;

还没有完善链表的排序;开始的思考还是拷贝到数组,然后利用sort()快排,然后再一个一个copy回去。这样一来的T(O) = n + n + nlogn = nlogn < n^2;
后续再跟进相应思路代码。

/*****************************************************************/

bool cmp(const Data& a, const Data& b) {
	return a.a < b.a;;
}

void List::ListSort() {
	int n = ListLength();

	Data* t = head;
	int i = 0;

	Data* arr = new Data[n];
	while (t != nullptr) { //直到最后
		arr[i++] = *t;	//copy
		t = t->next;
	}

	sort(arr, arr + n - 1,cmp);


	while (t != nullptr){ //直到最后
		*t = arr[i++];	//copy
		t = t->next;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值