双向链表的相关操作C++实现

对于循环双向链表

判断一个链表是否为空的条件为: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++,list,struct,null,input)