寒假作业-day2

1>请编程实现单向循环链表的头插,头删、尾插、尾删

代码:

#include
#include
#include

typedef int datatype;
typedef struct Node{
	datatype data;
	struct Node *next;
}*linklist;
int length(linklist head);
linklist create();
void output(linklist head);
linklist head_insert(linklist head, datatype e);
linklist head_delete(linklist head);
linklist rear_insert(linklist head, datatype e);
linklist rear_delete(linklist head);
linklist josefh(linklist head,int n,int m);
linklist bubble(linklist head);
int main(int argc,const char* argv[]){
	linklist head=NULL;
	int arr[]={5,4,3,2,1,0};
	int len=sizeof(arr)/sizeof(arr[0]);
	for(int i=0;inext;
		len++;
	}while(p!=head);
	return len;
}

linklist create(){
	linklist p=(linklist)malloc(sizeof(struct Node));
	if(!p)
		return NULL;
	p->data=0;
	p->next=p;
	return p;
}
void output(linklist head){
	if(!head)
		return;
	linklist p=head;
	do{
		printf("%d\t",p->data);
		p=p->next;
	}while(p!=head);
	puts("");
}
linklist head_insert(linklist head,datatype e){
	linklist p=create();
	p->data=e;
	if(!head){
                head=p;
                //head->next=head;
                return head;
        }
        linklist q=head;
        while(q->next!=head){
                q=q->next;
        }
	p->next=head;
        head=p;
        q->next=head;
        return head;
}

linklist head_delete(linklist head){
	if(!head)
		return head;
	if(head->next==head){
		free(head);
		head=NULL;
		return head;
	}
	linklist q=head;
	while(q->next!=head)
		q=q->next;
	linklist p=head;
        head=head->next;
        free(p);
        p=NULL;
	q->next=head;
	return head;
}
linklist rear_insert(linklist head,datatype e){
	linklist p=create();
	p->data=e;
	if(!head){
		head=p;
	//	p->next=head;
		return head;
	}
	linklist q=head;
	while(q->next!=head)
		q=q->next;
	q->next=p;
	p->next=head;
	return head;
}
linklist rear_delete(linklist head){
	if(!head)
		return head;
	if(head->next==head){
		free(head);
		head=NULL;
		return head;
	}
	linklist p=head;
	while(p->next->next!=head)
		p=p->next;
	linklist q=p->next;
	p->next=head;
	free(q);
	q=NULL;
	return head;
}

2>请编程实现单向循环链表约瑟夫环
约瑟夫环:用循环链表编程实现约瑟夫问题
n个人围成一圈,从某人开始报数1,2,.., m,数到m的人出圈,然后从出圈的下一个人(m+1)开始重复此过程
直到 全部人出圈,于是得到一个出圈人员的新序列
如当n=8,m=4时,若从第一个位置数起,则所得到的新的序列 为4,8,5,2,1,3,7,6

代码:

linklist josefh(linklist head,int n, int m){
	linklist s=NULL;
	linklist p=head;
//	printf("%d\n",n);
	while(n){
		for(int i=1;inext;
		s=rear_insert(s,p->next->data);
		linklist q=p->next;
		p->next=q->next;
		free(q);
		q=NULL;
		p=p->next;
		n--;
	}
	return s;

3>请编程实现单向循环链表的排序

代码:

linklist bubble(linklist head){
	if(!head)
		return head;
	linklist p=head;
	linklist q=p->next;
	do{
		do{
			//linklist q=p->next;
			if(p->data>q->data){
				int temp=q->data;
				q->data=p->data;
				p->data=temp;
			}
			q=q->next;
		}while(q!=head);
		p=p->next;
	}while(p!=head);
	return head;
}

1-3结果:

寒假作业-day2_第1张图片

你可能感兴趣的:(java,前端,服务器)