翼て


私信TA

用户名:uq_38394732497

访问量:971

签 名:

现实与理想之间差一个自律

等  级
排  名 483
经  验 4674
参赛次数 0
文章发表 4
年  龄 20
在职情况 学生
学  校 烟台工程职业技术学院
专  业 信传

  自我简介:

萌新一枚

解题思路:

看没有C的答案我来写一个

原来是打算用数组来写插入的但是好像要涉及数据的大量移动所以换成了方便理解的链表(正好我想练练链表)

用数组来写可以节省很多时间和行数 大家不要学我...   

水平有限.

注意事项:

指针的移动要写在所有判断的前面如果没办法的实现,

一定要想办法防止漏判

参考代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct bangdan{
	int chengji;
	int dqpm;
	int pm;
	struct bangdan *noxe;	
}dx;
main(){
	int a,i,c,b;
	dx *p,*q,*q1,*head;
	scanf("%d",&a);
	//新建第一个列表 
	head=(dx *)malloc(sizeof(dx)); //第一个地址 
	p=head;
	scanf("%d",&p->chengji); 
	p->dqpm=1;//它的当前名次为1 
	p->pm=1;
	p->noxe=NULL;//指针域为空 
	//创建接下来的成绩 
	for(i=1;i<a;i++){
		q1=(dx *)malloc(sizeof(dx));//新建地址给临时指针Q1 
		c=2;    
		q1->pm=i+1;
		scanf("%d",&q1->chengji);//输入成绩 
		q1->noxe=NULL; //好习惯你值得拥有 
		q=head;//用于遍历链表插入 
		p=head;
		if(head->chengji<=q1->chengji){ //判断是否比第一名分数还高 
			q1->dqpm=1;
			q1->noxe=head; //头指针指的原来的第一的地址给Q1的指针域 使之变成第二面 
			head=q1;       //头指针回到第一 
		}else { 
			do{
				if(q->noxe==NULL&&head->chengji>=q1->chengji){ //判断是否到最后了 
					q->noxe=q1;
					q1->dqpm=c;
					q1=NULL;
					break;
					
				}else{//不是最后就是中间 
					q=q->noxe;    //先移动指针到下一个使之变成一前一后的关系 
					if(q1->chengji>=q->chengji){  //判断是否到地方了 
						q1->dqpm=c;              //赋予当前名次 
						q1->noxe=q;		//插入操作 
						p->noxe=q1;
						break;					
					}  
				}
				c++;
				p=q;
				
			}while(q!=NULL);//这里千万不要写q->noxe!=null  因为上面是先判断然后移动指针 会导致每个数都漏判断一次 
		}	
	}
	scanf("%d",&b);
	q=head;
	while(q->pm!=b&&count<a){
		q=q->noxe;
	}
	printf("%d",q->dqpm);

	
	
}


 

0.0分

2 人评分

  评论区

  • «
  • »