双向链表的相关操作C++实现
2012-07-11 14:17
519 查看
对于循环双向链表
判断一个链表是否为空的条件为:head->next==head (头指针)
判断*p为最后一个节点的条件为:p->next=head
复制搜索
复制搜索
判断一个链表是否为空的条件为: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++】模版实现双向链表的各种操作(如:逆置、去重Unique、分类(冒泡)、合并)
- 【C++】模版实现双向链表的各种操作(如:逆置、去重Unique、分类(冒泡)、合并)
- 【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)
- !-- 带头结点带环的双向链表的相关操作实现 --!
- C++实现二叉树相关操作
- 链表的介绍及双向链表的实现c/c++/java
- C++实现双向循环链表
- C++实现链表基本操作
- c++:实现双向链表
- 双向循环链表基本操作的实现(C语言)
- C++ 双向链表简单实现通讯录