本文主要是介绍寒假作业-day2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1>请编程实现单向循环链表的头插,头删、尾插、尾删
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>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;i<len;i++)head=head_insert(head,arr[i]);output(head);head=head_delete(head);output(head);int arr1[]={6,7,8,9};int len1=sizeof(arr1)/sizeof(arr[0]);for(int i=0;i<len1;i++)head=rear_insert(head,arr1[i]);output(head);head=rear_delete(head);output(head);int m;printf("请输入m:");scanf("%d",&m);int len2=length(head);head=josefh(head,len2,m);output(head);head=bubble(head);output(head);return 0;
}
int length(linklist head){int len=0;linklist p=head;do{p=p->next;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;i<m-1;i++)p=p->next;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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!