双向循环链表
来源:互联网 发布:桌面图标归类软件 编辑:程序博客网 时间:2024/05/22 17:31
双向循环链表
- 基本结构
typedef int ElemType;typedef int DataType;typedef struct DNode{ ElemType data; struct DNode *pre, *next;}DNode, *DLinkList;
函数
- 创建双向循环链表
void ListCreate(DLinkList L, int n){ int i; DLinkList p, s; p = L; L->pre = L->next = L; //表为空时,前驱和后继都指向自己 for(i = 0; i < n; i ++) { s = (DLinkList)malloc(sizeof(DNode)); scanf("%d", &s->data); p->next = s; //前驱和后继相互连接 s->pre = p; s->next = L; //头和尾互指 L->pre = s; p = s; }}
- 插入结点
void ListInsert(DLinkList L, int i , ElemType e)//在第i个位置插入元素e{ DLinkList s, p = L; while(p->next != L && i > 1) //寻找第i-1个结点 { p = p->next; i--; } s = (DLinkList)malloc(sizeof(DNode)); s->data = e; s->next = p->next; //if(p->next != NULL) //非循环链表需要判断是否为最后一个结点 p->next->pre = s; s->pre = p; p->next = s;}
- 删除结点
void ListDelete(DLinkList L, int i, ElemType *e)//删除第i个结点, 并由*e返回其值{ DLinkList p = NULL, q = L; while(q->next != L && i >= 1) //直到第i个结点 { p = q; //p为q的前驱 q = q->next; i--; } p->next = q->next; //if(q->next != NULL) //非循环链表需要判断是否为最后一个结点 q->next->pre = p; *e = q->data; free(q);}
- 正序遍历
void ListTraverse(DLinkList L){ DLinkList p = L; while(p->next != L) { p = p->next; printf("%d", p->data); } printf("\n");}
- 逆序遍历
void ListReTraverse(DLinkList L){ DLinkList p = L; while(p->pre != L) { p = p->pre; printf("%d", p->data); } printf("\n");}
测试代码
#include <stdio.h>#include <stdlib.h>typedef int ElemType;typedef int DataType;typedef struct DNode{ ElemType data; struct DNode *pre, *next;}DNode, *DLinkList;void ListCreate(DLinkList L, int n){ int i; DLinkList p, s; p = L; L->pre = L->next = L; //表为空时,前驱和后继都指向自己 for(i = 0; i < n; i ++) { s = (DLinkList)malloc(sizeof(DNode)); scanf("%d", &s->data); p->next = s; //前驱和后继相互连接 s->pre = p; s->next = L; //头和尾互指 L->pre = s; p = s; }}void ListInsert(DLinkList L, int i , ElemType e)//在第i个位置插入元素e{ DLinkList s, p = L; while(p->next != L && i > 1) //寻找第i-1个结点 { p = p->next; i--; } s = (DLinkList)malloc(sizeof(DNode)); s->data = e; s->next = p->next; //if(p->next != NULL) //非循环链表需要判断是否为最后一个结点 p->next->pre = s; s->pre = p; p->next = s;}void ListDelete(DLinkList L, int i, ElemType *e)//删除第i个结点, 并由*e返回其值{ DLinkList p = NULL, q = L; while(q->next != L && i >= 1) //直到第i个结点 { p = q; //p为q的前驱 q = q->next; i--; } p->next = q->next; //if(q->next != NULL) //非循环链表需要判断是否为最后一个结点 q->next->pre = p; *e = q->data; free(q);}void ListTraverse(DLinkList L){ DLinkList p = L; while(p->next != L) { p = p->next; printf("%d", p->data); } printf("\n");}void ListReTraverse(DLinkList L){ DLinkList p = L; while(p->pre != L) { p = p->pre; printf("%d", p->data); } printf("\n");}int main(){ DNode L; int e; ListCreate(&L, 3); ListTraverse(&L); ListInsert(&L, 1, 0); ListTraverse(&L); ListInsert(&L, 5, 7); ListTraverse(&L); ListDelete(&L, 1, &e); ListTraverse(&L); ListDelete(&L, 4, &e); ListTraverse(&L); ListReTraverse(&L);}
0 0
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 循环双向链表
- 【南理oj】218 - Dinner (水)
- 设计模式-原型模式
- 分布式搜索elasticsearch配置文件详解
- 超过100W份源码免费下载
- Ubuntu 下编译 openJDK
- 双向循环链表
- NSInteger 与 NSUInteger 和 int与 NSInteger 区别
- 开发者日记(2016年01月07日11:52:28):关于android 广播的学习:
- git添加SSH Keys方法
- NSSet类型 以及与NSArray区别
- 设计模式-适配器模式
- 《剑指offer》——二叉搜索树的后序遍历序列
- 汇智慧网-Angular2
- wordpress IP黑名单插件:IP Blacklist Cloud屏蔽攻击者IP让网站更安全