#include <stdio.h>
#include <stdlib.h> typedef int ElemType; typedef struct DLNode{
ElemType data;
struct DLNode *next;
struct DLNode *prior;
}DLNode; DLNode *InitList(DLNode *DL);//初始化
int ListEmpty(DLNode *DL);//判空
int ListLength(DLNode *DL);//返回链表长度
int ListInsert(DLNode *DL, int i, ElemType e);//插入元素
int ListDelete(DLNode *DL, int i);//删除第i个元素
void TraverseList(DLNode *DL);//遍历线性表 //初始化
DLNode* InitList(DLNode *DL){
int x;
DLNode *p = NULL;
DLNode *r = NULL; DL = (DLNode *)malloc(sizeof(DLNode));
DL->next = DL;
DL->prior = DL;
r = DL; printf("输入直到-1为止\n");
while(){
scanf("%d", &x);
if(x == -){
printf("初始化成功\n");
break;
}
p = (DLNode *)malloc(sizeof(DLNode));
if(p){
p->data = x;
p->prior = r;
p->next = DL;
r->next = p;
DL->prior = p;
r = p;
}else{
printf("空间不足初始化失败\n");
return NULL;
} }
return DL; } //判空
int ListEmpty(DLNode *DL){
return (DL->next == DL);
} //插入元素
int ListInsert(DLNode *DL, int i, ElemType e){
if(i>ListLength(DL)+ || i<=){
printf("插入位置有误,插入失败\n");
return ;
}
DLNode *p = DL;
int j = ;
while(j<i){
p = p->next;
j++;
} DLNode *nDLNode = (DLNode *)malloc(sizeof(DLNode));
nDLNode->data = e;
nDLNode->prior = p->prior;
p->prior->next = nDLNode;
p->prior = nDLNode;
nDLNode->next = p;
printf("插入成功\n");
return ;
} //删除第i个元素
int ListDelete(DLNode *DL, int i){
if(i>ListLength(DL) || i<=){
printf("删除位置有误,插入失败\n");
return ;
}
DLNode *p = DL;
int j = ;
while(j<i){
p = p->next;
j++;
}
p->prior->next = p->next;
p->next->prior = p->prior; free(p);
printf("删除成功\n");
return ;
} //返回链表长度
int ListLength(DLNode *DL){
int len = ;
if(ListEmpty(DL)) return ;
DLNode *p = DL->next;
while(p->data!=DL->data){
len++;
p = p->next;
}
return len;
} //遍历线性表
void TraverseList(DLNode *DL){
if(ListEmpty(DL)){
printf("空链表");
}
DLNode *p = DL->next;
//终止循环遍历
while(p->data != DL->data){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
} int main(){
ElemType e = NULL;
DLNode *DL = NULL; //初始化测试
DL = InitList(DL); // //等价测试
// DLNode *d = DL->next->next;
// if(d->next->prior == d->prior->next){
// printf("d->next->prior == d->prior->next\n");
// }
// if(d->next->prior == d){
// printf("d->next->prior == d\n");
// }
// if(d == d->prior->next){
// printf("d == d->prior->next\n");
// } //遍历测试
TraverseList(DL);
//
// printf("双向循环链表长度为%d\n",ListLength(DL)); //插入元素测试
printf("第3个位置插入999\n");
ListInsert(DL, , );
TraverseList(DL);
//-----------------------------------------------------
//非法操作?循环双向链表插入一个巨大的位置是否合法?
//和老师讨论完,算不合法
printf("第567位置插入999\n");
ListInsert(DL, , );
TraverseList(DL);
//------------------------------------------------------
//删除元素测试
// printf("删除第1个位置\n");
// ListDelete(DL, 1);
// TraverseList(DL);
//------------------------------------------------------
//非法操作?同上
//新问题,1,2,3,4,-1,删除第5个是头节点。
//和老师讨论完,算不合法
// printf("删除第55位置\n");
// ListDelete(DL, 55);
// TraverseList(DL);
//------------------------------------------------------ }

最新文章

  1. Navisworks API 简单二次开发 (自定义工具条)
  2. YII2 日志
  3. JS绑定JavaScript事件
  4. javascript 与jquery为每个p标签增加onclick方法
  5. EMW 性能优化二之---并发配置
  6. Linode 优惠码
  7. mysql新建用户本地无法登录
  8. hadoop学习记录(一)HDFS
  9. freemarke之TemplateDirectiveModel详解
  10. 《javascript dom编程艺术》笔记(一)——优雅降级、向后兼容、多个函数绑定onload函数
  11. Linux 操作之基础命令
  12. Codeforces 741B Arpa&#39;s weak amphitheater and Mehrdad&#39;s valuable Hoses (并查集+分组背包)
  13. hadoop hdfs ha 模式
  14. C++11 多线程编程 使用lambda创建std::thread (生产/消费者模式)
  15. 什么是XP
  16. 快速选择算法/Select 寻找第k大的数
  17. 从浏览器地址栏输入URL到浏览器呈现数据全过程解析
  18. 【ContestHunter】【弱省胡策】【Round0】(A)&amp;【Round1】(B)
  19. 75. ID重新走过,备份表
  20. Unity教程之-Unity3d中针对Android Apk的签名验证(C#实现)

热门文章

  1. 这可能最简单的一种PS图片特效,零基础小白教程
  2. form分辨率
  3. 仓库管理移动应用解决方案&mdash;&mdash;C#开发的移动应用开源解决方案
  4. js 常用工具方法
  5. Redis—负载状态
  6. webstorm的git操作使用
  7. 4. Go语言—值类型和引用类型
  8. 使用 IDEA 翻译插件
  9. 再次体会wireshark的威力!
  10. 为什么MySQL数据库要用B+树存储索引?