(复习考研的休息区,心血来潮,写点代码)
三个规则:
1、不使用c++ stl库进行书写
2、最好基于严蔚敏老师的数据结构
3、最好使用malloc和realloc动态分配内存
(如果有问题或者是有没有实现的操作,请大家提出来)
一个链表直接包含双向和循环的
// 链表实现
#include<iostream>
#include<cstring>
using namespace std;
const int INF = 0x3f3f3f3f3f;
#define N 100
#define M 10
#define OK true
#define ERROR false
typedef struct DuLNode
{
// 单链表
int data;
struct DuLNode *ne;
struct DuLNode *prior;
}DuLNode , *DuLinkList;
void InitList(DuLinkList &L)
{
L = (DuLinkList)malloc(sizeof(DuLNode));
L -> data = INF;
// 循环的是指向自己即可
L -> prior = L -> ne = L;// 建立带头节点的单链表
}
// 头插法
void HeadInsert(DuLinkList &L)
{
DuLinkList now = L;
for(int i = 1;i <= M;i ++)
{
DuLinkList p = (DuLinkList)malloc(sizeof(DuLNode));
p -> data = i;
p -> ne = now -> ne;
now -> ne -> prior = p;
now -> ne = p;
p -> prior = now;
}
}
// 尾插法
void TailInsert(DuLinkList &L)
{
DuLinkList head = L , tail = L -> prior;
for(int i = 1;i <= M;i ++)
{
DuLinkList p = (DuLinkList)malloc(sizeof(DuLNode));
p -> data = i;
tail -> ne = p;
p -> prior = tail;
p -> ne = head;
head -> prior = p;
tail = tail -> ne; // 注意尾部在变化
}
}
// 插入到第idx位置
bool InsertList(DuLinkList &L , int idx , int e)
{
DuLinkList p = L -> ne;
idx --;
int i = 0;
while(p != L && i < idx - 1)
{
p = p -> ne;
i ++;
}
if(i > idx - 1) return ERROR;
cout << "插入数据" << e << endl;
DuLinkList s = (DuLinkList) malloc(sizeof(DuLNode));
s -> data = e;
s -> ne = p -> ne;
p -> ne -> prior = s;
p -> ne = s;
s -> prior = p;
return OK;
}
// 删除节点
int DeleteList(DuLinkList &L , int idx)
{
DuLinkList p = L -> ne;
int i = 0;
idx --;
while(p != L && i < idx - 1)
{
p = p -> ne;
i ++;
}
if(i > idx - 1) return ERROR;
int e = p -> ne -> data;
cout << "删除节点" << e << endl;
p -> ne = p -> ne -> ne;
p -> ne -> prior = p;
return e;
}
// idx节点的前驱和后继
pair<int , pair<int , int>> GetElem(DuLinkList L , int idx)
{
DuLinkList p = L -> ne;
int i = 0;
while(p != L && i < idx - 1)
{
p = p -> ne;
i ++;
}
return {(p -> prior -> data == INF) ? p -> prior -> prior -> data : p -> prior -> data ,
{p -> data ,
(p -> ne -> data == INF) ? p -> ne -> ne -> data : p -> ne -> data}};
}
void print(DuLinkList L)
{
DuLinkList p = L;
cout << "当前链表数据为:";
p = p -> ne;
bool f = false;
while(p != L) // 注意结束条件因为循环所以会不停的输出
{
if(f) cout << "->";
cout << p -> data;
f = true;
p = p -> ne;
}
cout << endl;
}
void printdata(auto t){printf("当前节点的值是%d , 前驱节点的值是%d , 后继几点的值是%d\n" , t.second.first , t.first , t.second.second);}
int main()
{
DuLinkList L;
InitList(L);
// HeadInsert(L);
TailInsert(L);
print(L);
// 从1开始编号
InsertList(L , 3 , 11);
print(L);
InsertList(L , 7 , 12);
print(L);
// 从1开始编号
DeleteList(L , 5);
print(L);
DeleteList(L , 4);
print(L);
auto t = GetElem(L , 6);
printdata(t);
t = GetElem(L , 4);
printdata(t);
t = GetElem(L , 1);
printdata(t);
t = GetElem(L , 10);
printdata(t);
}