不带头结点双链表
有问题可以一起在评论区讨论
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct DNode {
ElemType data;
struct DNode* prior, * next;
}DNode, * DLinkList;
//按位查找
DNode* GetElem(DLinkList, int);
//按值查找
DNode* LocateElem(DLinkList, ElemType);
//求表长
int Length(DLinkList);
//按位序插入
bool DListInsert(DLinkList&, int, ElemType);
//指定结点后插操作
bool InsertNextNode(DNode*, ElemType);
//指定结点前插操作
bool InsertPriorNode(DNode*, ElemType);
//按位序删除
bool DListDelete(DLinkList&, int, ElemType&);
//指定结点删除
bool DeleteNode(DLinkList&, DNode*);
//删除该结点的后续结点
bool DeleteNextDNode(DNode*);
//删除该双链表
void DestoryList(DLinkList&);
//初始化双链表
bool InitDListList(DLinkList&);
//判断双链表是否为空
bool Empty(DLinkList);
//尾插法建立双链表
bool DListTailInsert(DLinkList&);
//头插法建立双链表
bool DListHeadInsert(DLinkList&);
//后向遍历链表
void Traverse(DLinkList);
//前向遍历链表
void TraverseForward(DLinkList);
int main(void) {
DLinkList L;
//1.尾插法创建双链表
//DListTailInsert(L);
//2.头插法创建双链表
DListHeadInsert(L);
//3.按位查找
//DNode* p = GetElem(L, 1);
//4.按值查找
//p = LocateElem(L, 999);
/*if (p == NULL) {
printf("该值不存在\n");
}
else {
printf("该值为:%d\n", p->data);
}*/
//5.求表长
//printf("表长为:%d\n", Length(L));
//6.按位序插入
/*Traverse(L);
bool flag = DListInsert(L, 1, 777);
if (!flag) {
printf("插入失败!\n");
}*/
//7.指定结点前插操作
/*bool flag = InsertPriorNode(p, 5555);
if (!flag) {
printf("插入失败!\n");
}*/
//8.按位序删除
Traverse(L);
/*ElemType e;
bool flag = DListDelete(L, 1, e);*/
//9.指定结点删除
/*bool flag = DeleteNode(L, p);
if (!flag) {
printf("删除失败!\n");
}
else {
printf("删除成功!\n");
}*/
//10.删除该双链表
//DestoryList(L);
//Traverse(L);
TraverseForward(L);
return 0;
}
DNode* GetElem(DLinkList L, int i) {
if (i < 1) {
return NULL;
}
DNode* p = L;
int j = 1;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
DNode* LocateElem(DLinkList L, ElemType e) {
if (L == NULL) {
return NULL;
}
DNode* p = L;
while (p != NULL && p->data != e) {
p = p->next;
}
return p;
}
int Length(DLinkList L) {
DNode* p = L;
int j = 0;
while (p != NULL) {
p = p->next;
j++;
}
return j;
}
bool DListInsert(DLinkList& L, int i, ElemType e) {
if (i < 1) {
return false;
}
if (i == 1) {
return InsertPriorNode(L, e);
}
DNode* p = GetElem(L, i - 1);
return InsertNextNode(p, e);
}
bool InsertNextNode(DNode* p, ElemType e) {
if (p == NULL) {
return false;
}
//创建新结点
DNode* s = (DNode*)malloc(sizeof(DNode));
if (s == NULL) {
return false; //内存分配失败情况
}
s->data = e;
s->prior = p;
s->next = p->next;
if (p->next != NULL) { //p有后续结点
p->next->prior = s;
}
p->next = s;
return true;
}
bool InsertPriorNode(DNode* p, ElemType e) {
if (p == NULL) {
return false;
}
//将前插操作变为后插操作
ElemType temp = p->data;
p->data = e;
return InsertNextNode(p, temp);
}
bool DListDelete(DLinkList& L, int i, ElemType& e) {
//查找出该位序结点
DNode* p = GetElem(L, i);
if (p != NULL) {
e = p->data;
return DeleteNode(L, p);
}
else {
return false;
}
}
bool DeleteNode(DLinkList& L, DNode* p) {
if (p == NULL || L == NULL) {
return false;
}
if (p == L) { //删除的是首结点
if (L->next != NULL) {
L->next->prior = NULL;
}
L = L->next;
free(p);
return true;
}
//将p结点上一个结点的next指向p的后续结点
p->prior->next = p->next;
if (p->next != NULL) { //判断p是否为最后一个结点
p->next->prior = p->prior;
}
free(p);
return true;
}
bool DeleteNextDNode(DNode* p) {
if (p == NULL) {
return false;
}
DNode* q = p->next;
if (q == NULL) { //p没有后续
return false;
}
p->next = q->next;
if (q->next != NULL) { //q结点不是最后一个结点
q->next->prior = p;
}
free(q); //释放空间
return true;
}
void DestoryList(DLinkList& L) {
if (L == NULL) {
return;
}
while (L != NULL) {
DeleteNextDNode(L);
}
free(L);
L = NULL;
}
bool InitDListList(DLinkList& L) {
L = NULL;
return true;
}
bool Empty(DLinkList L) {
return L == NULL;
}
bool DListTailInsert(DLinkList& L) {
if (!InitDListList(L)) {
return false;
}
ElemType x;
DNode* s, * r = L;
printf("输入9999即退出\n");
printf("请输入:\n");
scanf("%d", &x);
while (x != 9999) {
s = (DNode*)malloc(sizeof(DNode));
if (s == NULL) {
return false;
}
s->data = x;
if (r == NULL) { //插入第一个结点
L = s;
s->next = NULL;
}
else {
s->next = r->next;
r->next = s;
}
s->prior = r;
r = s;
scanf("%d", &x);
}
return true;
}
bool DListHeadInsert(DLinkList& L) {
if (!InitDListList(L)) {
return false;
}
DNode* s;
ElemType x;
printf("输入9999即退出\n");
printf("请输入:\n");
scanf("%d", &x);
while (x != 9999) {
s = (DNode*)malloc(sizeof(DNode));
if (s == NULL) {
return false;
}
s->data = x;
if (L != NULL) { //插入第一个结点
L->prior = s;
}
s->next = L;
s->prior = NULL;
L = s;
scanf("%d", &x);
}
return true;
}
void Traverse(DLinkList L) {
if (L == NULL) {
return;
}
DNode* p = L;
while (p != NULL) {
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
void TraverseForward(DLinkList L) {
if (L == NULL) {
return;
}
DNode* p = GetElem(L, Length(L));
while (p != NULL) {
printf("%d\t", p->data);
p = p->prior;
}
printf("\n");
}