小女跪求用c语言 循环链表 编写的约瑟夫环!!

Python013

小女跪求用c语言 循环链表 编写的约瑟夫环!!,第1张

#include<stdio.h>

#include<stdlib.h>

//声明循环链表结构体

typedef struct LNode

{

      int num//数据域

      struct LNode *next//结构体指针

}LNode//结点类型

 

//创建结点

LNode *Create_node(int Lnum)

{

      LNode *Lp//创建结点指针

      Lp=(LNode *)malloc(sizeof(LNode))//分配动态储存空间

      Lp->num=Lnum//*Lp指向num,把num的值传给Lnum

      Lp->next=NULL//*Lp指向下一个元素结点为空,确定*Lp是头结点指针

      return Lp//返回头结点指针

}

 

//创建循环链表

LNode *Create_Linklist(LNode *pHead, int Lsum)

{

      int k

      LNode *p, *temp//创建两个指针

      for(k=1k<=Lsumk++)//遍历整个链表

      {

             p=Create_node(k)

             //如果链表为空,创建链表第一个结点,其next指针指向自身

             if(pHead==NULL)

             {

                    temp=p //把p的值传给temp

                    pHead=p //把p的值传给pHead

                    temp->next=pHead //让*temp指向的下一个位置为pHead

             }

             //否则,执行插入节点操作

             else

             {

                    p->next=temp->next//空白指针跟着*p后面,一个接一个插入

                    temp->next=p

                    temp=p //把p的值再传给temp

             }

      }

//测试是否生成循环链表成功!

 

      p=pHead

      k=1//初始化k的值

      while(p->next!=pHead)//用循环输出链表中的元素

      {

             printf("第%d个小孩的编号为:%d\n",k,p->num)

             p=p->next//指针移向下一个位置

             k++

      }

      printf("第%d个小孩的编号为:%d\n\n",k,p->num)//确保最后一个元素能显示出来

 

      return pHead//返回头指针

}

 

//执行出列操作

void Delete_Linklist(LNode *pHead,int Lstart, int Ldel)

{

      int i,count=1//count为计数器

      LNode *p, *temp

      p=pHead

      //找到第M个孩子所在的位置

      for(i=1i<Lstarti++)

             p=p->next

      //只剩1个结点时终止循环

      while(p->next!=p)

      {

             //找到要出列的孩子的位置

             for(i=1i<Ldeli++)

             {

                    temp=p

                    p=p->next

             }

             //执行出列操作

             temp->next=p->next//让*temp指向*p后面的结点

             printf("第%d个出列的小孩的编号为:%d\n",count,p->num)

             free(p)//释放*p

             count++

             //出列者的下一个孩子作为新的第一个报数者

             p=temp->next

      }

      printf("第%d个出列的小孩的编号为:%d\n",count,p->num)

      free(p)

      //所有人均出列,头结点释放后赋空值,避免出现悬垂指针

      pHead=NULL

}

 /*主函数*/

int main()

{

      int n,b,k

      LNode *pHead=NULL, *p//执行初始化操作

    //输入字符的合法性验证暂时忽略

      printf("请输入小孩的个数:\n")

      scanf("%d",&n)

      printf("请输入开始报数的小孩编号:\n")

      scanf("%d",&b)

      printf("请输入报数数目:\n")

      scanf("%d",&k)

      p=Create_Linklist(pHead,n)//调用创建链表函数

      Delete_Linklist(p,b,k)//调用删除链表函数

      return 0

}

这个跟你要求的差不多:

#include "stdio.h"

#include "string.h"

void main(){

/*1.定义结构体

id name birth add tel sex

1.输入七个成员通过用户输入存储

2.birth需要存年月日,电话要存家庭,工作,手机

int i=0

char tj[30]="\0"

char tem[30]="\0"

struct date{

char year[10]

char month[10]

char day[10]

char hou[12]

char miu[12]

char sec[12]

}

struct tel{

char hom[14]

char wor[14]

char pho[14]

}

struct stu{

char iid[10]

char name[12]

struct date birth

char addrs[20]

struct tel dh

char sex[4]

}per[1]

for(i=0i<1i++){

printf("输入id:")

scanf("%s",&per[i].iid)

rewind(stdin)

printf("\n输入name:")

gets(per[i].name)

rewind(stdin)

printf("\n输入birth(year,month,day,hou,miu,sec):")

scanf("%s %s %s %s %s %s",&per[i].birth.year,&per[i].birth.month,&per[i].birth.day,

&per[i].birth.hou,&per[i].birth.miu,&per[i].birth.sec)

rewind(stdin)

printf("\n输入addrs:")

gets(per[i].addrs)

rewind(stdin)

printf("\n输入dh(hom,wor,pho):")

scanf("%s %s %s",&per[i].dh.hom,&per[i].dh.wor,&per[i].dh.pho)

rewind(stdin)

printf("\n输入sex:")

gets(per[i].sex)

}

for (i=0i<1i++)

{

printf("\n输出:\n id:%s,\n name:%s,\n birth:%s.%s.%s %s:%s:%s\n add:%s,\n tel:%s,%s,%s,\n sex:%s\n",

per[i].iid,per[i].name,per[i].birth.year,per[i].birth.month,per[i].birth.day,

per[i].birth.hou,per[i].birth.miu,per[i].birth.sec,

per[i].addrs,per[i].dh.hom,per[i].dh.wor,per[i].dh.pho,per[i].sex)

}

*/

/*5.将结构体熟记按id排倒序(簇集索引)

for (i=0i<ni--)

{

printf("\n输出:\n id:%s,\n name:%s,\n birth:%s.%s.%s %s:%s:%s\n add:%s,\n tel:%s,%s,%s,\n sex:%s\n",

per[i].iid,per[i].name,per[i].birth.year,per[i].birth.month,per[i].birth.day,

per[i].birth.hou,per[i].birth.miu,per[i].birth.sec,

per[i].addrs,per[i].dh.hom,per[i].dh.wor,per[i].dh.pho,per[i].sex)

}

*/

/*3.遍历此数据,接收用户输入,按id,name出生年月日进行查找

printf("输入id / name / 出生年 月 日 进行查找:")

scanf("%s",&tj)

for(i=0i<1i++){

strcat(tem,per[i].birth.year)

strcat(tem,per[i].birth.month)

strcat(tem,per[i].birth.day)

printf("%s,%s",tem,tj)

if(tj==per[i].iid || tj==per[i].name || tj==tem)

printf("\n输出:\n id:%s,\n name:%s,\n birth:%s.%s.%s %s:%s:%s\n add:%s,\n tel:%s,%s,%s,\n sex:%s\n",

per[i].iid,per[i].name,per[i].birth.year,per[i].birth.month,per[i].birth.day,

per[i].birth.hou,per[i].birth.miu,per[i].birth.sec,

per[i].addrs,per[i].dh.hom,per[i].dh.wor,per[i].dh.pho,per[i].sex)

}

*/

/*4.将此id add name tel 分别存入 union enum 分析其存储特点

作如下案例:

接收用户输入月份,判断这个月份有多少天(枚举);

enum temp{ID,ADD,NAME,TEL}

enum month{jan=1,feb=2,mar=3,apr=4,may=5,jun=6,jul=7,aug=8,sep=9,oct=10,nov=11,dec=12}m

int n=0

printf("输入月份(1~12):")

scanf("%d",&m)

switch(m){

case jan:

case mar:

case may:

case jul:

case aug:

case oct:

case dec:

n=31

break

case feb:

n=28

break

case apr:

case jun:

case sep:

case nov:

n=30

break

default:

printf("输入的数据有误,月份只能为1~12\n")

}

printf("%d月共有%d天\n",m,n)

*/

/*6.a=20,b=2计算按位与、或、异的值,计算a左位移3,b右位移4.弄清原理

int a=20,b=2,c,d,e,f,g

c=a&b //按位 与 运算

d=a|b //按位 或 运算

e=a^b //按位 异或 运算

f=a<<3//a左移3

g=a>>4//a右移4

printf("a:%d \n b:%d \n c:%d \n d:%d \n e:%d \n f:%d \n g:%d \n",a,b,c,d,e,f,g)

*/

/*7.id name C语言成绩 java成绩 C#成绩 .NET成绩输入几行数据。

int i=0,sum=0,avg=0,asum=0,aavg=0,k=0,tem=0,j=0

char temname[10]="\0",temiid[10]="\0"

struct student{

char iid[10]

char name[10]

int c

int java

int cx

int dnet

}stu[2]

for(i=0i<2i++){

printf("请输入id:")

scanf("%s",&stu[i].iid)

rewind(stdin)

printf("\n请输入name:")

gets(stu[i].name)

rewind(stdin)

printf("\n请输入c:")

scanf("%d",&stu[i].c)

rewind(stdin)

printf("\n请输入java:")

scanf("%d",&stu[i].java)

rewind(stdin)

printf("\n请输入c#:")

scanf("%d",&stu[i].cx)

rewind(stdin)

printf("\n请输入.net:")

scanf("%d",&stu[i].dnet)

}

*/

/*9。按照C语言成绩排序(降序)

for(i=0i<1i++)

{

k=i

for(j=i+1j<2j++)

if(stu[j].c>stu[k].c) k=j

if(k!=i)

{

strcmp(temiid,stu[i].iid)

strcmp(stu[i].iid,stu[k].iid)

strcmp(stu[k].iid,temiid)

strcmp(temname,stu[i].name)

strcmp(stu[i].name,stu[k].name)

strcmp(stu[k].name,temname)

tem=stu[i].c

stu[i].c=stu[k].c

stu[k].c=tem

tem=stu[i].cx

stu[i].cx=stu[k].cx

stu[k].cx=tem

tem=stu[i].java

stu[i].java=stu[k].java

stu[k].java=tem

tem=stu[i].dnet

stu[i].dnet=stu[k].dnet

stu[k].dnet=tem

}

}

for (i=0i<2i++)

{

printf("%d:id:%s,name:%s,c: %d,c#:%d,java:%d,.net:%d\n",i,stu[i].iid,

stu[i].name,stu[i].c,stu[i].cx,stu[i].java,stu[i].dnet)

}

*/

/*8。计算某人成绩的总和,某人成绩的平均分,全班成绩的总分,全班成绩的平均分\

for(i=0i<2i++){

sum=stu[i].java+stu[i].c+stu[i].cx+stu[i].dnet

avg=sum/4

printf("%s的总成绩为%d,平均分为%d\n",stu[i].name,sum,avg)

sum=0

avg=0

sum=stu[i].java+stu[i].c+stu[i].cx+stu[i].dnet

asum=asum+sum

}

aavg=asum/i

printf("全班的总成绩为%d,平均分为%d",asum,aavg)

*/

}