双向链表的实现
2016-04-01 17:19
507 查看
之前的博客讲到了线性表的链式存储结构,实现了链表的各种操作(http://blog.csdn.net/u010429311/article/details/51037580)。但是,单链表有单向性的缺点,为了克服这一缺点,可以尝试实现双向链表。下图是双向链表的结构:
我们也可以实现双向链表的一些基本操作:
以下是实现基本操作的代码:
我们也可以实现双向链表的一些基本操作:
以下是实现基本操作的代码:
#include <stdio.h> #include <malloc.h> #define OK 1 #define ERROR 0 typedef int ElemType; typedef int Status; typedef struct DNode { ElemType data; struct DNode *next; struct DNode *prior; //指向上一个结点的指针 } DNode, *DulLinkList; Status createList(DulLinkList &L, int n) { DulLinkList p; L = (DulLinkList) malloc(sizeof(DNode)); L->next = NULL; L->prior = NULL; if (n == 0) { //如果长度为0,则头结点指向的指针指向本身 L->next = L->prior = L; return OK; } int i = 0; for (i = n; i > 0; i--) { p = (DulLinkList) malloc(sizeof(DNode)); scanf("%d", p->data); p->next = L->next; L->next = p; p->prior = L; if (i == n) //最后一个元素的next指针指向头结点 p->next = L; p->next->prior = p; //下一个结点的prior指针指向前一个结点 } return OK; } Status insertList(DulLinkList &L, int i, ElemType e) { DulLinkList s, p; p = L; int j = 0; while (p && j < i - 1) { //寻找第i-1个结点 p = p->next; j++; if (p == L) break; } if (p == L || j > i - 1) return ERROR; if (!(s= (DulLinkList) malloc(sizeof(DNode)))) return ERROR; s->data = e; //插入结点 s->prior = p->prior; p->prior->next = s; s->next = p; p->prior = s; return OK; } Status deleteList(DulLinkList &L, int i, ElemType &e) { DulLinkList p; p = L; int j = 0; while (p->next && j < i - 1) { //寻找第i-1个结点 p = p->next; j++; if (p->next == L) break; } if (p->next == L || j > i - 1) return ERROR; e = p->data; //获取结点元素 p->prior->next = p->next; //删除结点 p->next->prior = p->prior; free(p); //释放被删除结点的空间 return OK; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- [C/C++]反转链表
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- C#实现基于链表的内存记事本实例
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法