赞
踩
一、请编程实现单向循环链表的头插,头删、尾插、尾删。
二、请编程实现单向循环链表约瑟夫环
约瑟夫环:用循环链表编程实现约瑟夫问题
n个人围成一圈,从某人开始报数1, 2, …, m,数到m的人出圈,然后从出圈的下一个人(m+1)开始重复此过程,
直到 全部人出圈,于是得到一个出圈人员的新序列
如当n=8,m=4时,若从第一个位置数起,则所得到的新的序列 为4, 8, 5, 2, 1, 3, 7, 6。
三、请编程实现单向循环链表的排序。
(以上均为单向循环链表,故在一个文件内完成)
代码:
- #include<stdlib.h>
- #include<string.h>
- #include<stdio.h>
- typedef struct node //定义链表节点结构体:数据域、指针域
- {
- int data;
- struct node *next;
- }*linklist;
- linklist create_node()//创建新节点并初始化,返回节点地址
- {
- linklist s=(linklist)malloc(sizeof(struct node));
- if(NULL==s)
- return NULL;
- s->data=0;
- s->next=s;
- return s;
- }
- linklist insert_head(linklist head,int element)
- {
- linklist s=create_node();
- if(NULL==s)
- {
- puts("fail");
- return NULL;
- }
- s->data=element;
- if(NULL==head)
- {
- head=s;
- return head;
- }
- linklist p=head;
- while(p->next!=head)
- p=p->next;
- s->next=head;
- head=s;
- p->next=head;
- return head;
- }
- linklist insert_rear(linklist head,int element)
- {
- linklist s=create_node();
- if(NULL==s)
- {
- puts("fail");
- return NULL;
- }
- s->data=element;
- if(NULL==head)
- {
- head=s;
- return head;
- }
- linklist p=head;
- while(p->next!=head)
- p=p->next;
- p->next=s;
- s->next=head;
- return head;
- }
- void output(linklist head)
- {
- linklist p=head;
- while(p->next!=head)
- {
- printf("%d ",p->data);
- p=p->next;
- }
- printf("%d",p->data);
- puts("");
- }
- linklist delete_head(linklist head)
- {
- if(NULL==head)
- {
- puts("empty");
- return head;
- }
- if(head==head->next)
- {
- free(head);
- return NULL;
- }
- linklist del=head;
- linklist p=head;
- while(p->next!=head)
- p=p->next;
- head=head->next;
- p->next=head;
- free(del);del=NULL;
- return head;
- }
- linklist delete_rear(linklist head)
- {
- if(NULL==head)
- {
- puts("empty");
- return head;
- }
- if(head==head->next)
- {
- free(head);
- return NULL;
- }
- linklist p=head;
- while(p->next->next!=head)
- p=p->next;
- linklist del=p->next;
- p->next=head;
- free(del);del=NULL;
- return head;
- }
- void joseph_ring(linklist head,int len,int m)
- {
- linklist p=head;
- for(int i=1;i<=len;i++)
- {
- for(int j=1;j<=m-2;j++)
- {
- p=p->next;
- }
- linklist del=p->next;
- printf("%d ",del->data);
- p->next=del->next;
- free(del);
- p=p->next;
- }
- puts("");
- }
- void simple_sort(linklist head)
- {
- linklist p=head;
- for(p;p->next!=head;p=p->next)
- {
- linklist min=p;
- for(linklist q=p->next;q!=head;q=q->next)
- {
- if(min->data > q->data)
- min=q;
- }
- if(min!=p)
- {
- int t=min->data;
- min->data=p->data;
- p->data=t;
- }
- }
- }
- int main(int argc, const char *argv[])
- {
- linklist head=NULL;//定义单向循环链表头指针并初始化
- int len;//根据终端输入的值确定单向循环链表的长度
- printf("please enter the length of the linklist:");
- scanf("%d",&len);
- int element;
- for(int i=0;i<len;i++)//循环输入数值,头插或尾插创建循环链表
- {
- printf("%d element:",i+1);
- scanf("%d",&element);
- // head=insert_head(head,element);//头插
- head=insert_rear(head,element);//尾插
- }
- output(head);//遍历
- simple_sort(head);//排序
- output(head);
- /*//代码实现约瑟夫环
- for(int i=1;i<=len;i++)
- {
- head=insert_rear(head,i);//根据长度循环尾插输入约瑟夫环内数值;
- }
- output(head);//遍历
- int m;
- printf("please enter the m of the joseph ring:" );
- scanf("%d",&m);
- joseph_ring(head,len,m);
- head=delete_head(head);//头删
- head=delete_head(head);
- output(head);
- head=delete_rear(head);//尾删
- output(head);
- */
-
- return 0;
- }
运行:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。