双向链表的相关操作C++实现
来源:互联网 发布:网络小兼职 编辑:程序博客网 时间:2024/05/21 15:03
对于循环双向链表
判断一个链表是否为空的条件为:head->next==head (头指针)
判断*p为最后一个节点的条件为:p->next=head
- #include<iostream>
- using namespace std;
- /*双链表结构*/
- typedef struct node
- {
- int data;
- struct node *prior;
- struct node *next;
- }DNode;
- /*创建一个带头节点的双链表*/
- void CreateDLink(DNode *&head)
- {
- int x;
- DNode *p,*s;
- s=(DNode *)malloc(sizeof(DNode));
- if(s==NULL)
- {
- cout<<"Fail to malloc the head node!"<<endl;
- }
- s->data=0;
- s->prior=NULL;
- s->next=NULL; //建立一个头结点为head的双链表
- head=s; //若是循环双向链表则为:s->next=s->prior=s;
- cout<<"please input the data of the node"<<endl;
- cin>>x;
- while(x!=0)
- {
- p=(DNode *)malloc(sizeof(DNode));
- if(p==NULL)
- {
- cout<<"Fail to malloc a new node!"<<endl;
- }
- p->data=x;
- s->next=p;
- p->prior=s;
- p->next=NULL;
- s=p;
- cin>>x;
- }
- }
- void PrintLink(DNode *head)
- {
- if(head->next==NULL)
- {
- cout<<"The list is NULL"<<endl;
- return ;
- }
- DNode *p;
- p=head->next;
- while(p!=NULL)
- {
- cout<<p->data<<" ";
- p=p->next;
- }
- cout<<endl;
- }
- int Length(DNode *head) //求双链表长度
- {
- int len=0;
- DNode * p=head->next;
- while(p!=NULL)
- {
- len++;
- p=p->next;
- }
- return len;
- }
- DNode * Get(DNode *head,int i) //获取链表第i个节点地址
- {
- int j=0;
- DNode *p=head->next;
- while(j<i&&p!=NULL)
- {
- p=p->next;
- j++;
- }
- if(p!=NULL)
- return p;
- else
- return NULL;
- }
- int InsertNode(DNode *head,int x,int i)//在第i个位置插入一个节点
- {
- DNode *s,*p;
- s=(DNode *)malloc(sizeof(DNode));
- s->data=x;
- if(i==0)
- {
- s->next=head->next;
- if(head->next!=NULL)
- head->next->prior=s;
- s->prior=head;
- head->next=s;
- }
- else
- {
- p=Get(head,i-1); //查找待插入节点前一个位置
- if(p==NULL)
- return 0;
- else
- {
- s->next=p->next;
- if(p->next!=NULL)
- p->next->prior=s;
- s->prior=p;
- p->next=s;
- }
- }
- return 1;
- }
- void DeleteNode(DNode *head,int index) //删除第index个节点
- {
- if(head->next==NULL)
- {
- cout<<"The list is NULL"<<endl;
- return;
- }
- DNode *p,*s/*保存待删除的节点*/;
- if(index==0)
- {
- s=head->next;
- head->next=s->next;
- if(s->next!=NULL)
- s->next->prior=head;
- free(s);
- }
- else
- {
- p=Get(head,index-1);
- if(p==NULL)
- cout<<"The Node "<<index<<"is not exist"<<endl;
- else
- {
- s=p->next;
- p->next=s->next;
- if(s->next!=NULL)
- s->next->prior=p;
- free(s);
- }
- }
- }
- int main(int argc,char *argv[])
- {
- DNode *head;
- CreateDLink(head);
- cout<<"链表长度为:"<<Length(head)<<endl;
- PrintLink(head);
- cout<<"第3个节点的值为:"<<Get(head,3)->data<<endl;
- cout<<"输入插入节点的位置及值:"<<endl;
- int value, index;
- cin>>index>>value;
- InsertNode(head,value,index);
- cout<<"插入后的链表为:"<<endl;
- PrintLink(head);
- cout<<"请输入要删除的节点位置:"<<endl;
- cin>>index;
- DeleteNode(head,index);
- PrintLink(head);
- return 0;
- }
0 0
- 双向链表的相关操作--C语言实现
- 双向链表的相关操作C++实现
- 双向链表的相关操作C++实现
- 双向链表的相关操作C++实现
- 双向链表的实现与操作(C语言实现)
- 双向链表的相关操作
- C语言实现双向链表的基本操作
- C语言实现双向链表的基本操作
- 双向链表的操作实现(c语言)
- c语言实现双向链表的基本操作
- java实现双向链表的操作
- 双向循环链表操作的实现
- 双向循环链表操作的实现
- 双向链表的基本操作实现
- 双向链表的创建和相关操作
- 关于双向链表的相关一系列操作(作为备忘)
- 双向链表的创建和相关操作
- [C++]双向链表操作
- NSException异常处理
- mysql union和union all的区别
- JavaScript面向对象精要(二)
- Android CardView 设置点击效果
- UNPv1第二章:传输层
- 双向链表的相关操作C++实现
- Elasticsearch
- GreenSock2
- 【多线程】Java线程的创建
- 给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
- Oracle 11g笔记——自动存储管理(ASM)
- 【Netty4 简单项目实践】一、长连接服务通用框架原型
- MySQL中information_schema数据库相关权限的说明
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例