约瑟夫环问题
模 块 划 分
(1)带头结点的单循环链表抽象数据类型sclinlist,其中包括的基本操作函数有:初始化操作函数,插入一个结点操作函数,删除一个几结点操作函数,取一个结点数据操作函数和判表是否为非空操作函数。
(2) void sclldeleteafter(sclnode *p),其功能是删除带头结点的单循环链表中指针p所指结点的下一个结点。
(3) void jesephring(sclnode *head,int m),其功能是对带头结点的单循环链表head,
以m为初始报数上限值实现问题要求。
(4) void main(),主函数,其功能是给出测试数据值,建立测试数据值的带头结点单循环链表,调用jesering()函数实现问题要求。
#include<stdio.h>
#include<stdlib.h>
#define null 0
//数据类型datatype定义如下:
typedef struct
{
int number;
int cipher;
}datatype;
//带头结点单循环链表结点的结构体定义如下:
typedef struct node
{
datatype data;
struct node *next;
}sclnode;
//初始化
void scllinitiate(sclnode * *head)
{ if((*head=(sclnode*)malloc(sizeof(sclnode)))==null)exit(1);
(*head)->next=*head;
}
//插入一个结点
int scllinsert(sclnode *head,int i,datatype x)
{
sclnode *p,*q;
int j;
p=head->next;j=1;
while(p!=head&&j<i-1)
{ p=p->next;j++;
}
if(j!=i-1&&i!=1)
{ printf("input parameter error!");
return 0;
}
if((q=(sclnode*)malloc(sizeof(sclnode)))==null)exit(1);
q->data=x;
q->next=p->next;
p->next=q;
return 1;
}
//删除一个结点
int sclldelete(sclnode *head,int i,datatype *x)
{
sclnode *p,*q;
int j;
p=head;j=0;
while(p->next!=head&&j<i-1)
{ p=p->next;j++;}
if(j!=i-1)
{printf("delete parameter error!");
return 0;
}
q=p->next;
p->next=p->next->next;
*x=q->data;
free(q);
return 1;
}
//取一个结点数据元素值
int scllget(sclnode *head,int i,datatype *x)
{
sclnode *p;
int j;
p=head;j=0;
&n
补充:asp.net教程,C语言
上一个:加注解的纸条问题新写的程序推敲
下一个:内部排序之二分插入排序