目录
实验环境:
vscode 2022 社区版
vscode 2022 社区版的搭建:
https://blog.csdn.net/lijiamingccc/article/details/123552207
== 所有代码均经过测试,附运行结果截图==
1.初始化双链表
bool InitDLinkList(DLinkList &L){
L = (DNode *)malloc(sizeof(DNode));
if (L==NULL){
return false;
}
L->prior = NULL;
L->next = NULL;
return true;
}
2. 判空
bool empty(DLinkList L){
if (L->next == NULL){
return true;
}
return false;
}
3. 查找
3.1 按位查找
DNode* GetElem(DLinkList L,int i){
if(i<0) return NULL;
int j = 1;
DNode *p = L;
while(p!=NULL && j<=i){
p = p->next;
j++;
}
return p;
}
3.2 按值查找
DNode* LocateElem(DLinkList L,ElemType e){
DNode *p = L;
if (p==NULL) return NULL;
p = p->next;
while (p != NULL && p->data !=e){
p=p->next;
}
return p;
}
4.插入
4.1 后插值是e的节点
bool Insert_NextDNode(DNode* p, ElemType e){
if (p == NULL) return false;
DNode* q = (DNode*)malloc(sizeof(DNode));
if (q == NULL) return false;
q->data =e;
q->next = NULL;
q->prior = p;
if(p->next != NULL){
p->next->prior = q;
q->next = p->next;
}
p->next = q;
return true;
}
4.2 后插节点s
bool InsertNextDNode(DNode *p,DNode *s){
if (p == NULL || s==NULL){
return false;
}
s->next = p->next;
if(p->next != NULL){
p->next->prior = s;
}
s ->prior = p;
p ->next = s;
return true;
}
4.3 前插节点s
// 前插,在p节点前插入节点s
bool InsertPriorDNode(DNode* p, DNode* s){
// 在p节点的前节点后插一个节点,即在p节点前插入节点s
if(p->prior != NULL){
return InsertNextDNode(p->prior, s);
}
return false;
}
4.4 按位插入
// 按位插入,在第i个位置插入值为e的节点(位序i)
bool InsertDLinkList(DLinkList &L, int i, ElemType e) {
if (i <= 0) return false;
// 这里调用GetElem
DNode *p = GetElem(L, i);
return Insert_NextDNode(p, e);
}
5. 删除节点
5.1 删除p节点的后继节点
bool DeleteNextNode(DNode* p) {
if (p == NULL) return false;
DNode* q = p->next;
if (q == NULL) return false;
p->next = q->next;
if (q->next != NULL) q->next->prior = p;
free(q);
return true;
}
5.2 删除指定节点
//删除指定节点s
bool DeleteNode(DNode *s) {
DNode *p = s->prior;
p->next = s->next;
if (s->next != NULL) {
s->next->prior = p;
}
free(s);
return true;
}
6. 销毁双链表
bool DestoryList(DLinkList& L) {
while (L->next != NULL) {
DeleteNextNode(L);
}
free(L);
L = NULL;
return true;
}
7.建立双链表
7.1 头插法
DLinkList List_HeadInsert(DLinkList& L) {
InitDLinkList(L);
ElemType x;
printf("正在使用头插法建立双链表:\n");
while (x!=9999) {
scanf("%d",&x);
if(x==9999) break;
Insert_NextDNode(L, x);
}
return L;
}
7.2 尾插法
DLinkList List_TailInsert(DLinkList &L) {
InitDLinkList(L);
DNode *p = L;
ElemType x;
printf("正在使用尾插法建立双链表:\n");
while (x!=9999) {
scanf("%d",&x);
if(x==9999) break;
Insert_NextDNode(p, x);
p = p->next;
}
return L;
}
8. 计算长度
int Length(DLinkList L) {
DNode *p = L;
int len = 0;
while (p->next != NULL) {
len++;
p = p->next;
}
return len;
}
tip:自定义一个输出函数
void print(DLinkList L) {
printf("当前列表: ");
DNode *s = L;
while (s->next!=NULL) {
s = s->next;
printf("%d ",s->data);
}
printf("\n");
}
9. 测试主函数
int main(){
DLinkList L;
List_TailInsert(L);
print(L);
// 按位查找和长度测试
printf("\n链表的第3个元素是%d\n",GetElem(L, 3)->data);
printf("链表的长度是%d\n",Length(L));
// 插入测试
printf("在位序1的位置上插入22");
InsertDLinkList(L, 1, 22);
print(L);
// 删除测试
int e;
printf("删除位序3的位置上的元素\n");
ListDelete(L, 3, e);
print(L);
// 销毁链表 测试
DestoryList(L);
return 0;
}