c语言数据结构双向循环链表操作题目

【问题描述】输入n个整数,创建一个双向循环链表进行存储。这些整数从第二个开始,递增有序(设a2<a3<...<an) (ai为第i个整数)。试编写程序,创建双向循环链表,依次将输入的整数存储在该链表的各节点中。然后,将第一个结点删除并插入链表中的适当位置,使整个链表递增有序。

【输入形式】先输入整数的个数,再输入整数列。
【输出形式】以整数递增的顺序,依次输出双向循环链表各个节点存储的整数。

【样例输入】5 3 1 2 4 5
【样例输出】1 2 3 4 5

【样例说明】输入数据的第一个数是整数的个数,其后是整数列,该整数列从第二个开始,递增有序,数据间以空格分开。
【评分标准】根据输入的数据创建双向循环链表,并把原来部分有序的链表处理成有序的链表并输出。

#include<iostream>
#include<stdlib.h>
using namespace std;

typedef struct DLnode
{
	int data;
	struct DLnode *prior;
	struct DLnode *next;
}DLnode,*Dlnode;

void InitDlist(Dlnode &head) //循环双向初始化 
{
	head=(Dlnode)malloc(sizeof(DLnode));
	head->prior=head;
	head->next=head;
}

void InsertDlist(DLnode *head,int i) //头插法 
{
	Dlnode p=NULL;
	p=(DLnode *)malloc(sizeof(DLnode));
	p->data=i;
	p->next=head->next;
	p->next->prior=p;
	p->prior=head;
	head->next=p;
}

void PrintDlist(Dlnode head)
{
	Dlnode p=head->next;
	while(head!=p)
	{
		cout<<p->data<<' ';
		p=p->next;
	}
	cout<<endl;
}

int LengthDlist(Dlnode head)
{
	DLnode *p=NULL;
	int len=0;
	p=head->next;
	while(p!=head)
	{
		len++;
		p=p->next;
	}
	return len;
}

Dlnode Sort(Dlnode head) //形参返回值为头指针,形参也为头指针 
{
	int i=0,j=0;
	int n=LengthDlist(head);//调用求长函数 
	Dlnode p=head;
	Dlnode q=head;
	//接下来进行冒泡排序
	for(i=0;i<n;i++)
	{
		p=head->next;
		q=p->next;
		for(j=0;j<n-i-1;j++)
		{
			if(p->data>q->data)
			{
				if(q->next==NULL) //判断是否是尾结点 
				{
					p->next=q->next;
					q->prior=p->prior;
					q->next=p;
					p->prior->next=q;
					p->prior=q; 
				}
				else
				{
					p->next=q->next;
					q->prior=p->prior;
					q->next=p;
					p->prior->next=q;
					//下一行与之前不同
					q->next->prior=p;
					p->prior=q;
					//位置交换结束 
					q=p->next;//位置交换结束之后往后移 
				}
			}
			else //条件不成立 
			{
				p=p->next;
				q=p->next;
			}
		}
	}
	return head;
}

int main()
{
	int n,i;
	Dlnode head=NULL;
	InitDlist(head);
	cin>>n;
	while(n--)
	{
		cin>>i;
		InsertDlist(head,i);
	}
	Sort(head);
	PrintDlist(head);
}

猜你喜欢

转载自blog.csdn.net/weixin_43579811/article/details/88829314
今日推荐