线性表:循环链表(猴子选大王)和有序表

代码有注释
有序表代码:

#include
using namespace std;
typedef struct node
{
	int data;
	node *next;
}Sqlist;
const int N=100; 
int n;
void init(Sqlist *&h)
{
	h=(Sqlist *)malloc(sizeof(Sqlist));
	h->next=NULL;
}
void createlist(Sqlist *&h,int a[])
{
	Sqlist *r,*s;
	r=h;
	for(int i=0;i<n;i++)
	{
		s=(Sqlist *)malloc(sizeof(Sqlist));
		s->data=a[i];
		r->next=s;
		r=s;
		//printf("1\n");
	}
	r->next=NULL;
}
void sort(Sqlist *&h)
{
	Sqlist *q,*pre,*p;
	q=h->next->next;//指向第一个有效节点 
	h->next->next=NULL;//保存一个数据结点 
	while(q!=NULL)
	{
		p=q->next;
		pre=h;//从头遍历 
		while((pre->next)&&pre->next->data<q->data)
		{
			pre=pre->next;
		}//找出要插入的位置 
		//printf("1\n");
		q->next=pre->next;
		pre->next=q;//尾插 
		q=p;//往后找 
	}
}
void print(Sqlist *&h)//输出 
{
	Sqlist *q;
	q=h->next;
	while(q)
	{
		printf("%d\n",q->data);
		q=q->next;
	}
}
int main()
{
	int a[100];
	Sqlist *h;
	init(h);//初始化
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	createlist(h,a);
	print(h);//输出创造好的链表
	printf("\n");
	sort(h);
	print(h);//输出有序表
	return 0;
} 

**循环链表:**通过猴子选大王的题目来写
题目:
( 100分 )
具体要求如下:

让 N 只候选猴子围成一圈(最多100只猴子),从某位置起顺序编号为 1 ~ N 号;从第 1 号开始报数,每轮从 1 报到 3 ,凡报到 3 的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数;如此不断循环,最后剩下的一只猴子就选为猴王。

测试输入:5

预期输出:4号猴子是大王。

测试输入:18

预期输出:14号猴子是大王。
代码:

include<iostream>
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int cnt[100] ;
struct node
{
	int data;
	node* next;
};
void king(node* h, int n)
{
	node* q = h->next, * pre = h, * p;
	int i = 0;
	while (n != 1)
	{
		pre = q;
		q = q->next;
		i = (i + 1) % 3;
		//printf("%d %d %d\n",pre->data,q->data,i);;
		if (i == 2)//pre指向要删除的点
		{
			p = pre->next;
			pre->next = pre->next->next;
			cnt[p->data] = 1;
			free(p);
			q = pre->next;
			i++;
			i = i % 3;
			n--;
		}
	}
}
int main()
{
	int i, n, m;
	cin >> n;
	node* h;
	h = (node*)malloc(sizeof(node));
	h->next = NULL;//初始化
	node* p = h, * q;
	for (i = 1; i <= n; i++)
	{
		q = (node*)malloc(sizeof(node));
		q->data = i;
		p->next = q;
		p = q;
	}
	p->next = h->next;//精髓尾指向头节点
	//printf("1\n");
	king(h, n);
	for (int i = 1; i <= n; i++)
	{
		if (!cnt[i])printf("%d", i);
	}

}

有问题请评论!!!!

你可能感兴趣的:(数据结构,数据结构,单链表,链表,循环链表)