/*
*下次再说
*
*结束时间:2022.03.15 19:26
/*
双链表
在王道书上,插入和删除的操作在p是最后一个结点的情况下是错误的
所以对操作进行了改进
按位、按值查找,同样还是O(n)
在敲的时候产生了一点错误的想法,例如返回第i个结点的函数实现时
自己老是想到下标i-1的结点,这里是双链表呀,没有下标的呦,下次不能这么想了
经过这几次的实现,自己对这个理解确实有了深的理解,DNole* 和DLinkList
我也在想,对于双链表,前插入是不是也可以像昨天一样,后插完事后,进行data交换
在进行插入时,要先修改s结点后面的指针
*/
#include<iostream>
using namespace std;
typedef struct DNode {
int data;
struct DNode* prior, *next;
}DNode,*DLinkList;
//在结点p后面插入结点
//思考:在p结点前面插入数据的话,可以参考单链表,后插并交换数据????
bool InsertDNode_behind(DNode* p, DNode* s) {
if (p == NULL)
return false;
if (p->next == NULL) {//p是最后一个结点
p->next = s;
s->prior = p;
s->next = NULL;
return true;
}
//p是中间结点
else {
s->next = p->next;
p->next->prior = s;
//一定要先连接s后面的指针,其他顺序无所谓
p->next = s;
s->prior = p;
return true;
}
}
//删除结点p后面的结点
bool DeleteDNode_behind_p(DNode* p) {
if (p == NULL)
return false;
if (p->next == NULL)
return false;
//p是中间结点
else {
DNode* s = p->next;
p->next = s->next;
s->next->prior = p;
return true;
}
}
//前插法输入创建双链表
bool InitDNode(DLinkList& DL) {
DL = new DNode;//分配并返回,头结点
DL->next = NULL;
DL->prior = NULL;
DNode* r = DL;//尾结点指针
//这里第一次敲错了,不应该指向DL->next;
//DL返回了头结点,next显示还是NULL,就会乱套
int n;
cout << "请输入结点个数:" << endl;
cin >> n;
for (int i = 0; i < n; i++) {
cout << "第" << i+1 << "个结点数值:" << endl;
int e;
cin >> e;
DNode* s = new DNode;
s->data = e;
InsertDNode_behind(r, s);//直接借用
r = s;
}
r->next = NULL;
return true;
}
//输出双链表
bool printDNode(DLinkList L) {
if (L->next == NULL)
return false;//空表
DNode* p = L->next;//头结点
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
return true;
}
//返回第i个结点
DNode *GetDNode(DLinkList L, int i) {
if (L->next == NULL)
return NULL;//空表
DNode* p = L->next;//第一个结点
int j = 0;//记位
while (p != NULL&&j<i-1) {
j++;
p = p->next;
}
return p;
}
//删除第i个结点
bool DeleteDNode_behind(DLinkList& L, int i) {
//删除第i个结点,那就找到第i-1个,然后删除i-1后面的结点
DNode* p = GetDNode(L, i - 1);
DeleteDNode_behind_p(p);
return true;
}
int main() {
DLinkList DL;
InitDNode(DL);
printDNode(DL);
DNode *s=GetDNode(DL,3);
cout << s->data << endl;
DeleteDNode_behind(DL, 3);
printDNode(DL);
return 0;
}
王道——双链表
于 2022-03-15 19:30:38 首次发布