对于循环双向链表
判断一个链表是否为空的条件为:head->next==head (头指针)
判断*p为最后一个节点的条件为:p->next=head
- #include<iostream>
- #include<stdlib.h>
- 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;
- }