与单链表相比,双链表前驱结点与后继结点的指针可以更方便地查找需要的结点。通过C语言可以实现双链表的判空、插入、删除与遍历操作等。注意对双链表进行操作时,需要将边界情况及处理考虑进去。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/*定义一个双链表*/
typedef struct DNode {
int data;
struct DNode* prior, * next;
}DNode,*DLinklist;
/*初始化双链表*/
bool InitDLinkList(DLinklist* L) {
(*L) = (DNode*)malloc(sizeof(DNode)); //分配一个头结点
if (L == NULL) //内存不足,分配失败
return false;
(*L)->prior = NULL; //头结点的prior永远指向NULL
(*L)->next = NULL; //头结点之后暂时还没有结点
return true;
}
/*判空*/
bool Empty(DLinklist L) {
if (L->next == NULL)
return true;
else
return false;
}
/*在p结点之后插入s结点*/
bool InsertNextDNode(DNode* *p, DNode* *s) {
if (p == NULL || s == NULL) //非法参数
return false;
if ((*p)->next != NULL) //如果p结点有后继结点
(*p)->next->prior = (*s);
(*s)->prior = (*p);
(*p)->next = (*s);
return true;
}
/*删除p结点的后继结点*/
bool DeleteNextDNode(DNode* *p) {
if (p == NULL)
return false;
DNode* q = (*p)->next; //找到p的后继结点q
if (q == NULL)
return false; //p没有后继
(*p)->next = q->next;
if (q->next != NULL) //q结点不是最后一个结点
q->next->prior = (*p);
free(q);
return true;
}
/*销毁双链表*/
void DestoryList(DLinklist* L) {
while ((*L)->next != NULL)
DeleteNextDNode(&(*L));
free(*L); //释放头结点
(*L) = NULL; //头指针指向NULL
}
void main() {
DLinklist L,S,P;
InitDLinkList(&L);
InitDLinkList(&S);
InitDLinkList(&P);
L->data = 11;
S->data = 12;
P->data = 13;
InsertNextDNode(&L, &S);
InsertNextDNode(&L->next, &P);
DeleteNextDNode(&L);
DestoryList(&L);
}
问题记录:在VS2022中同一个解决方案中放置两个项目,如何对单个项目进行单独调试?
设置启动项单独运行项目:选中项目,右键,找到“设置为启动项”
1852

被折叠的 条评论
为什么被折叠?



