双向链表的相关操作C++实现
来源:互联网 发布:编程思路怎么写 编辑:程序博客网 时间:2024/05/18 01:33
对于循环双向链表
判断一个链表是否为空的条件为: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;}
复制搜索
复制搜索
- 双向链表的相关操作--C语言实现
- 双向链表的相关操作C++实现
- 双向链表的相关操作C++实现
- 双向链表的相关操作C++实现
- 双向链表的实现与操作(C语言实现)
- 双向链表的相关操作
- C语言实现双向链表的基本操作
- C语言实现双向链表的基本操作
- 双向链表的操作实现(c语言)
- c语言实现双向链表的基本操作
- java实现双向链表的操作
- 双向循环链表操作的实现
- 双向循环链表操作的实现
- 双向链表的基本操作实现
- 双向链表的创建和相关操作
- 关于双向链表的相关一系列操作(作为备忘)
- 双向链表的创建和相关操作
- [C++]双向链表操作
- 快速排序
- windows下apache tomcat整合
- memccpy() -- 拷贝内存内容
- Android学习--动态向SPinner控件中添加数据
- 源代码制作成RPM包
- 双向链表的相关操作C++实现
- VC往PE文件末尾读写数据
- 潮人必备:极简风格的iPhone外设Spike
- 为鼠标点击事件添加全局效果处理
- NLS_LANG与NLS_LANGUAGE的区别
- C#在默认浏览器中打开网页
- Strtus2 session 监听器 监听用户在线状态
- DevExpress GridColumn 显示图片
- Unity摄像机