数据结构 实验二

题意我是真理解不了 凑合看吧

数据结构实验二

题目

image-20220503182441382

测试数据

张一
张二
张三
张四
张五
张六
张七
张八
张九
张十
张十一
张十二
张十三
张十四
张十五
张十六
张十七
张十八
张十九
张二十
张二十一
张二十二
张二十三
张二十四
张二十五
张二十六
张二十七
张二十八
张二十九
张三十
2
19

源代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node{
    char data[100];
    int rrand;
	int num;   //手持密码值
    struct node *prev;
    struct node *next;
}LNode;
int create_name();
LNode *Creatlist();
int Insertlist(LNode *head);
void print_list(LNode *head,int n);
LNode *find_S(LNode *head,int S);
void yuesefu(LNode *head,int age);
FILE *fp=NULL,*op=NULL;
char student[50][30];
int rand_num[50],age,S;
int main() 
{  
  fp=fopen("C://Users//72720//Desktop//output.ifo","w+");
  create_name();
  op=fopen("C://Users//72720//Desktop//output.ifo","r");
  LNode *head = Creatlist();
  Insertlist(head);
  print_list(head,30);
  scanf("%d",&S);
  if(find_S(head,S)==0)printf("未找到编号为%d的节点",S);
  else  printf("%s",find_S(head,S)->data);
  scanf("%d",&age);
  yuesefu(head,age);
}
LNode *find_S(LNode *head,int S)
{
	LNode *p=head;
	while(p){
	   if(p->rrand==S)return p;
	   else p=p->next; 
	   if(p==head)return 0;
	}
}
int Insertlist(LNode *head){
    LNode *p = head;
    //在头后开始插入结点,所以结点 编号 为 2 
    int num = 2;
    //头的编号为1
    head->num = 1;
    //插入结点
    for(int i=0;i<=29;i++)
	{
        LNode *q = (LNode*)malloc(sizeof(LNode));
        fscanf(op,"%s",p->data);
        p->rrand=rand_num[i];
        q->num = num;
        num++;
        q->next = head;
        head->prev = q;
        p->next = q;
        q->prev = p;
        p = p->next;
    }
    //释放空结点
    p = head->prev;
    p->prev->next = p->next;
    p->next->prev = p->prev;
    free(p);
}
LNode *Creatlist(){
    LNode *head = (LNode*)malloc(sizeof(LNode));
    head->next = head;
    head->prev = head;
    return head;
}
void yuesefu(LNode *head,int age){
    int n = 1;
    LNode *p = NULL;
    while(head){
        //与密码相同
        if(n == age){
            printf("%d %d\n",head->rrand,head->num); 
            //结束
            if(head->next == head){
                printf("\n");
                free(head);
                break;
            }
            //重置密码
            age = head->rrand;          
            //释放结点
            p = head; 
            head = head->next;
            p->prev->next = p->next;
            p->next->prev = p->prev;
            free(p);
            //从 1 开始
            n = 1;
        }else{
            //继续游戏
            head = head->next;
            n++;
        }
    }
}
void print_list(LNode *head,int n){
        LNode *p = head;
        while(n--){
            printf("%s\n",p->data);
            p = p->next;
        }
}
int create_name(){
	for(int i=0;i<=29;i++)
	  {
	  	scanf("%s",student[i]); 
	  	rand_num[i]=rand();
	  	fprintf(fp,"%s%d\n",student[i],rand_num[i]);
	  }  
	fclose(fp);
}

运行结果

张一
张二
张三
张四
张五
张六
张七
张八
张九
张十
张十一
张十二
张十三
张十四
张十五
张十六
张十七
张十八
张十九
张二十
张二十一
张二十二
张二十三
张二十四
张二十五
张二十六
张二十七
张二十八
张二十九
张三十
张一41
张二18467
张三6334
张四26500
张五19169
张六15724
张七11478
张八29358
张九26962
张十24464
张十一5705
张十二28145
张十三23281
张十四16827
张十五9961
张十六491
张十七2995
张十八11942
张十九4827
张二十5436
张二十一32391
张二十二14604
张二十三3902
张二十四153
张二十五292
张二十六12382
张二十七17421
张二十八18716
张二十九19718
张三十19895
2
未找到编号为2的节点
19
4827 19
18467 2
2995 17
16827 14
32391 21
29358 8
9961 15
11942 18
24464 10
11478 7
26500 4
17421 27
3902 23
19169 5
15724 6
23281 13
5705 11
41 1
5436 20
153 24
18716 28
28145 12
491 16
14604 22
26962 9
12382 26
19895 30
292 25
6334 3
19718 29
posted @ 2022-05-03 19:08  m1m0ry  阅读(31)  评论(1编辑  收藏  举报