链表初解(二)——双链表的创建、删除、插入
来源:互联网 发布:重生之星际淘宝主微盘 编辑:程序博客网 时间:2024/05/16 12:38
下面是基本的双链表操作,由于双链表有两个方向,所以在删除和插入节点时,可以节省一个指针,只用一个链表上的指针和一个待操作的指针即可完成插入和删除;同时也要注意在编写双链表时对情况的判断要仔细,否则很容易出错~
#include<iostream>using namespace std;typedef struct student{int data;struct student *next;struct student *pre;}dnode;//建立双链表dnode *create(){dnode *head, *p, *s;int x;head = (dnode *)malloc(sizeof(dnode));p = head;cout<<"\nInput the data : ";while(1){if(scanf("%d", &x) != EOF && x != 0){s = (dnode *)malloc(sizeof(dnode));s->data = x;p->next = s;s->pre = p;p = s;}else break;}head = head->next;head->pre = NULL;p->next = NULL;return head;}//双链表删除节点dnode *del(dnode *head, int num){dnode *p1;p1 = head;while(num != p1->data && p1->next != NULL)p1 = p1->next;if(num == p1->data){if(head == p1){head = head->next;head->pre = NULL;}/*此处的处理与单链表不同,因为双链表有两个方向,所以在定义时仅定义一个指针,这使得当出现删除链表尾部时,由于NULL没有前驱,导致无法连接,所以要分开讨论。*/else if(p1->next == NULL) p1->pre->next = NULL;else{//p1为最后一个节点,如没有上一个分支,则第二个语句会出错。p1->pre->next = p1->next;p1->next->pre = p1->pre;}free(p1);//释放}else cout<<"There is no %d "<<num;return head;}//双链表插入节点dnode *insert(dnode *head, int num){dnode *p0, *p1;p1 = head;p0 = (dnode *)malloc(sizeof(dnode));p0->data = num;while(num > p1->data && p1->next != NULL)p1 = p1->next;if(num <= p1->data){if(head == p1){p0->next = p1;p1->pre = p0;head = p0;}else{p1->pre->next = p0;p0->pre = p1->pre;p0->next = p1;p1->pre = p0;}}else{//插入尾部~p1->next = p0;p0->next = NULL;p0->pre = p1;}return head;}//计算表长int length(dnode *head){int n = 0;while(head != NULL){head = head->next;n++;}return n;}//打印双链表void print(dnode *head){int n = length(head);cout<<"Output the DoubleList ("<<n<<" records~) : ";while(head != NULL){if(head->next == NULL) cout<<head->data<<endl;else cout<<head->data<<"<->";head = head->next;}}//排序函数同单链表,此处省略了~,默认输入为递增哈~int main(){dnode *head;//创建head = create();print(head);//删除int numD;cout<<"\nDelete : ";cin>>numD;print(del(head, numD));//插入int numS;cout<<"\nInsert : ";cin>>numS;print(insert(head, numS));return 0;}
Ps:仅供参考~~
4 0
- 链表初解(二)——双链表的创建、删除、插入
- 双链表的创建、插入、删除
- 双链表的创建、插入、删除
- 双链表的创建、删除、插入
- 链表初解(一)——单链表的创建、删除、插入、测长、排序、逆置
- 数据结构之 双链表的创建,删除,插入
- 数据结构—链表的定义、创建、遍历、插入、删除
- 单链表的创建(头插法尾插法),插入,删除
- (C++版)链表(二)——实现单项循环链表创建、插入、删除等操作
- (C++版)链表(二)——实现单项循环链表创建、插入、删除等操作
- 链表——创建、插入、删除、查找
- 数据结构学习(五)——循环双链表的操作之创建,插入、删除
- 单链表的创建,删除,插入
- 单链表的创建、插入、删除
- 堆的创建、插入、删除
- 堆的创建,插入,删除
- 堆的创建,插入,删除
- 数据结构——单链表的创建、删除、遍历以及节点的插入、删除等操作
- 开源Web安全测试工具调研
- webservice安全性浅谈
- h3c comwarev7 socket sk_buff到底可以有多大
- C/C++函数返回数组指针的一点点小姿势
- windows游戏编程<四>X86 32位保护模式下的内存管理概述(一)
- 链表初解(二)——双链表的创建、删除、插入
- android中Handler的初步认识(一)
- ajax是否能跨域请求,解决的办法
- c++中const 的用法
- Spring 基础教程之四:JavaBean基本配置详解
- URL重写的实现
- 关于构造函数 c++
- poj3624-我的第一道01背包水题
- 解析xml的几种方法,他们的原理,比较 以及JAVA源码