#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)
*/
}