数据结构之双链表的C语言实现
来源:互联网 发布:英文域名转码 编辑:程序博客网 时间:2024/05/22 13:04
在写过单链表之后再来写双链表会发现,双链表和单链表在实现上的主要区别在于:双链表每个节点需要考虑她的前驱和后继,因此在插入和删除操作的时候就需要格外注意对链表最后一个元素的操作,因为最后一个元素的next指向的是NULL,所以在写插入和删除操作的时候需要判断是不是对最后一个节点操作。
#include <iostream>#include <stdlib.h>using namespace std;typedef struct LNode{ int data; struct LNode *pev; struct LNode *next;}LNode, *LinkList;LinkList initLinkList(LinkList &L);bool append(LinkList &L, int val);bool insert(LinkList &L, int val, int i);int getLength(LinkList &L);int del(LinkList &L,int i);void printList(LinkList &L);LinkList initLinkList(LinkList &L){ L = (LinkList)malloc(sizeof(LNode)); L->data = 1; L->pev = L; L->next = NULL; return L;}bool append(LinkList &L, int val){ LNode *s, *p; p = L; while(p->next != NULL) { p = p->next; } s = (LinkList)malloc(sizeof(LNode)); s->data = val; p->next = s; s->pev = p; s->next = NULL; return true;}bool insert(LinkList &L, int val, int i){ LNode *s, *p; if(i < 1 || i > getLength(L) + 1) return false; if(i == (getLength(L) + 1)) append(L,val); else { p = L; while(i--) { p = p->next; } s = (LinkList)malloc(sizeof(LNode)); s->data = val; s->next = p; p->pev->next = s; s->pev = p->pev; p->pev = s; } return true;}int getLength(LinkList &L){ int cnt = 1; LNode *pointer; if(L->next == NULL) return 0; pointer = L->next; while(pointer->next != NULL) { cnt++; pointer = pointer->next; } return cnt;}int del(LinkList &L, int i){ LNode *p; int num; if(i < 1 || i > getLength(L)) return 9999; if(i == getLength(L)) { p = L; while(i--) { p = p->next; } p->pev->next = NULL; num = p->data; free(p); p = NULL; } else { p = L; while(i--) { p = p->next; } p->pev->next = p->next; p->next->pev = p->pev; num = p->data; free(p); p = NULL; } return num;}void printList(LinkList &L){ LNode *pointer; if(L->next == NULL) return; pointer = L; while(pointer->next != NULL) { pointer = pointer->next; cout<<pointer->data<<"->"; } cout<<"end"<<endl;}int main(){ LNode *L; initLinkList(L); cout<<"Length: "<<getLength(L)<<endl; append(L,100); append(L,200); insert(L,300,1); insert(L,400,1); insert(L,500,4); printList(L); cout<<"Length: "<<getLength(L)<<endl; cout<<del(L,6)<<endl; printList(L); cout<<"Length: "<<getLength(L)<<endl; return 0;}
贴上运行结果
Length: 0
400->300->100->500->200->end
Length: 5
9999
400->300->100->500->200->end
Length: 5
阅读全文
0 0
- 数据结构之双链表的C语言实现
- 数据结构之队列的实现(c语言)
- 数据结构之栈的c语言实现
- C语言实现的数据结构之------哈希表
- 数据结构之单链表的C语言实现
- 数据结构之冒泡排序的实现(C语言)
- 数据结构之选择排序的实现(C语言)
- C语言数据结构之:顺序表的实现
- 数据结构C语言之栈的简单实现
- 数据结构 学习笔记之:顺序栈的C语言实现
- 数据结构c语言实现之单链表的应用
- 数据结构之---c语言实现线性表的顺序表
- 数据结构之---c语言实现栈的顺序存储
- 数据结构之---C语言实现串的顺序存储
- 数据结构之---C语言实现矩阵的转置
- 数据结构之---C语言实现二叉树的顺序存储
- 数据结构之--图的讲解与C语言实现
- 数据结构之带优先级的队列(C语言实现)
- hibernate缓存介绍
- 洛谷P3810(三维偏序,CDQ分治果题)
- 认识Django
- DHCP之数据包
- 线性表的C++实现
- 数据结构之双链表的C语言实现
- 企业级java开发与架构,大型分布式综合项目实战,高并发解决方案
- 剑指offer_二叉树的下一个节点
- spring的定时器
- 7-2 求一批整数中出现最多的数字
- TCP/IP & Stack
- Python
- Python入门<一>
- 连续函数的平移自交相关