双向链表的相关操作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;}


复制搜索
原创粉丝点击