链表的基本操作
初始化,添加,删除,排序
#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;
}
}