#include "DuL.h"
#include <stdio.h>
#include <malloc.h>
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode, *DuLinkList;
DuLinkList GetElemP_DuL(DuLinkList va, int i) {
// L为带头结点的单链表的头指针。
// 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
DuLinkList p;
p=(DuLinkList )malloc(sizeof(DuLinkList));
p = va->next;
int j = 1; // 初始化,p指向第一个结点,j为计数器
while (p!=va && j<i) { //顺指针向后查找,直到p指向第i个元素或p为空
p = p->next;
++j;
}
if (p==va && j<i) return NULL; // 第i个元素不存在
else return p;
} // GetElem_L
Status ListInsert_DuL(DuLinkList &L, int i, ElemType e) { //算法2.18
// 在带头结点的双链循环线性表L的第i个元素之前插入元素e,
// i的合法值为1≤i≤表长+1。
DuLinkList p,s;
p=(DuLinkList )malloc(sizeof(DuLinkList));
if (!(p = GetElemP_DuL(L, i))) // 在L中确定第i个元素的位置指针p
return ERROR; // p=NULL, 即第i个元素不存在
if (!(s = (DuLinkList)malloc(sizeof(DuLinkList))))
return ERROR;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return OK;
} // ListInsert_DuL
Status ListDelete_DuL(DuLinkList &L, int i,ElemType &e) {//算法2.19
// 删除带头结点的双链循环线性表L的第i个元素,i的合法值为1≤i≤表长
DuLinkList p;
p=(DuLinkList )malloc(sizeof(DuLinkList));
if (!(p = GetElemP_DuL(L, i))) // 在L中确定第i个元素的位置指针p
return ERROR; // p=NULL, 即第i个元素不存在
e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
//free(p);
return OK;
} // ListDelete_DuL
void main()
{
int e=0;
int order=0;
int length=5;
DuLinkList L;
DuLinkList p;
DuLinkList q;
ElemType a;
int i;
L=(DuLinkList )malloc(sizeof(DuLinkList));
L->next=L;
L->prior=L;
p=(DuLinkList )malloc(sizeof(DuLinkList));
q=(DuLinkList )malloc(sizeof(DuLinkList));
printf("1.建立一个有序的带表头结点的双链表\n");
printf("2.双向遍历该双链表;\n");
printf("3.按位置号查找该双链表\n");
printf("4.按结点值查找该双链表\n");
printf("5.逆置该双链表\n");
printf("6.插入一元素\n");
printf("7.删除指定位置号\n");
printf("8.退出\n");
printf("输入第一条选项\n");
while(order!=8)
{
scanf("%d",&order);
switch(order)
{
case 1:
for(i=1;i<length+1;i++)
{
printf("input ");
scanf("%d",&e);
ListInsert_DuL(L, i, e);
};
printf("输入下一条选项");
break;
case 2: for(i=1;i<length+1;i++)
{
p = GetElemP_DuL(L, i); // 在L中确定第i个元素的位置指针p
printf("%d\n",p->data);
}
printf("\n");
for(i=length;i>0;i--)
{
p = GetElemP_DuL(L, i); // 在L中确定第i个元素的位置指针p
printf("%d\n",p->data);
};
printf("输入下一条选项");
break;
case 3: printf("输入位置号\n");
scanf("%d",&i);
p = GetElemP_DuL(L, i); // 在L中确定第i个元素的位置指针p
printf("%d位置号上为%d\n",i,p->data);
printf("输入下一条选项");
break;
case 4: printf("输入节点值\n");
scanf("%d",&e);
for(i=1;i<length+1;i++)
{
p = GetElemP_DuL(L, i); // 在L中确定第i个元素的位置指针p
if(e==p->data)
printf("该节点在%d位置\n",i);
else
printf("error");
}
printf("输入下一条选项");
break;
case 5:
for(i=1;i<length+1;i++)
{
q->next=L->next;
L->next=L->prior;
L->prior=q->next;
q=L;
L=L->next;
L->prior=q;
}
/* whiel
while(L->prior!=L)
{
q=L->prior;
q->prior->next = q->next;
q->next->prior = q->prior;
p->prior->next=q;
q->prior=p->prior;
p->prior=q;
q->next=p;
}*/
for(i=1;i<length+1;i++)
{
p = GetElemP_DuL(L, i); // 在L中确定第i个元素的位置指针p
printf("%d\n",p->data);
}
printf("输入下一条选项");
break;
case 6: printf("输入位置号\n");
scanf("%d",&i);
printf("输入值\n");
scanf("%d",&e);
ListInsert_DuL(L, i, e);
length++;
printf("输入下一条选项");
break;
case 7: printf("输入位置号\n");
scanf("%d",&i);
ListDelete_DuL(L,i,a);
length--;
printf("输入下一条选项");
break;
case 8: printf("退出\n");
default: printf("ERROR\n");
}
}
}
dul_list.rar_C 双向链表_vc list_双向链表
版权申诉
97 浏览量
2022-09-23
22:50:58
上传
评论
收藏 14KB RAR 举报
JaniceLu
- 粉丝: 78
- 资源: 1万+
最新资源
- 基于matlab实现图像处理,本程序使用背景差分法对来往车辆进行检测和跟踪.rar
- 基于matlab实现视频监控中车型识别代码,自己写的,希望和大家多多交流.rar
- sdk.config
- 基于matlab实现配电网三相潮流计算方法,对几种常用的配电网潮流计算方法进行了对比分析.rar
- 基于matlab实现配电网潮流 经典33节点 前推回代法潮流计算 回代电流 前推电压 带注释.rar
- 基于matlab实现模拟退火遗传算法的车辆调度问题研究,用MATLAB语言加以实现.rar
- 基于matlab实现蒙特卡洛的的移动传感器节点定位算法仿真代码.rar
- 华中数控系统818用户说明书
- 基于matlab实现卡尔曼滤波器完成多传感器数据融合 对多个机器人的不同传感器数据进行融合估计足球精确位置.rar
- 基于matlab实现进行简单车辆识别-车辆检测.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈