描述
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
例示:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
注:0代表从高到低,1代表从低到高
本题含有多组输入数据!
输入描述:
输入多行,先输入要排序的人的个数,然后分别输入他们的名字和成绩,以一个空格隔开
输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例1
输入:
3
0
fang 90
yang 50
ning 70
复制
输出:
fang 90
ning 70
yang 50
复制
示例2
输入:
3
1
fang 90
yang 50
ning 70
3
0
moolgouua 43
aebjag 87
b 67
复制
输出:
yang 50
ning 70
fang 90
aebjag 87
b 67
moolgouua 43
复制
说明:
第一组用例:
3
1
fang 90
yang 50
ning 70
升序排序为:
yang 50
ning 70
fang 90
第二组降序为:
aebjag 87
b 67
moolgouua 43
在判断升序和降序逻辑方面混乱
#include <stdio.h>
#include <stdlib.h>
#if 0
#define dbg printf
#else
#define dbg
#endif
struct list
{
char name[32];
int val;
struct list *former;
struct list *next;
};
void former_insert(struct list *a, struct list *b)
{
b->former = a->former;
a->former = b;
b->next = a;
if(b->former)
{
b->former->next = b;
}
}
void next_insert(struct list *a, struct list *b)
{
b->next = a->next;
a->next = b;
b->former = a;
if(b->next)
{
b->next->former = b;
}
}
int main(void)
{
int cnt, index;
int i, j;
char out[256][32] = {0};
char tmp[32] = {0};
struct list *p, *q;
struct list *head;
j = 0;
while(scanf("%d", &cnt) != EOF)
{
head = (struct list* )malloc(sizeof(struct list));
scanf("%d", &index);
scanf("%s", head->name);
scanf("%d", &head->val);
head->former = NULL;
head->next = NULL;
for(i=1; i<cnt; i++)
{
p = (struct list* )malloc(sizeof(struct list));
scanf("%s", p->name);
scanf("%d", &p->val);
if(p->val < head->val)
{
former_insert(head, p);
head = p;
}
else if(p->val == head->val)
{
if(index == 1)
{
next_insert(head, p);
}
else
{
former_insert(head, p);
head = p;
}
}
else
{
q = head;
if(index == 1)
{
while(q && q->val<=p->val)
{
q = q->next;
}
}
else
{
while(q && q->val<p->val)
{
q = q->next;
}
}
if(q != NULL)
{
former_insert(q, p);
}
else
{
q = head;
while(q->next)
{
q = q->next;
}
next_insert(q, p);
}
}
}
p = head;
if(index == 1)
{
while(p)
{
dbg("(%d):%s %d\n", __LINE__, p->name, p->val);
memset(tmp, 0, sizeof(tmp));
snprintf(tmp, sizeof(tmp), "%s %d\n", p->name, p->val);
strncpy(out[j], tmp, strlen(tmp));
j++;
q = p->next;
free(p);
p = q;
}
}
else
{
p = head;
while(p->next)
{
p = p->next;
}
while(p)
{
dbg("(%d):%s %d\n", __LINE__, p->name, p->val);
memset(tmp, 0, sizeof(tmp));
snprintf(tmp, sizeof(tmp), "%s %d\n", p->name, p->val);
strncpy(out[j], tmp, strlen(tmp));
j++;
q = p->former;
free(p);
p = q;
}
}
}
for(i=0; i<j; i++)
{
printf("%s", out[i]);
}
return 0;
}
完善版本
#include <stdio.h>
#include <stdlib.h>
#if 0
#define dbg printf
#else
#define dbg
#endif
struct list
{
char name[32];
int val;
struct list *former;
struct list *next;
};
void former_insert(struct list *a, struct list *b)
{
b->former = a->former;
a->former = b;
b->next = a;
if(b->former)
{
b->former->next = b;
}
}
void next_insert(struct list *a, struct list *b)
{
b->next = a->next;
a->next = b;
b->former = a;
if(b->next)
{
b->next->former = b;
}
}
int main(void)
{
int cnt, index;
int i, j;
char out[256][32] = {0};
char tmp[32] = {0};
struct list *p, *q;
struct list *head;
j = 0;
while(scanf("%d", &cnt) != EOF)
{
head = (struct list* )malloc(sizeof(struct list));
scanf("%d", &index);
scanf("%s", head->name);
scanf("%d", &head->val);
head->former = NULL;
head->next = NULL;
for(i=1; i<cnt; i++)
{
p = (struct list* )malloc(sizeof(struct list));
scanf("%s", p->name);
scanf("%d", &p->val);
if(index == 1)
{
if(p->val < head->val)
{
former_insert(head, p);
head = p;
}
else
{
q = head;
while(q && q->val<=p->val)
{
q = q->next;
}
if(q == NULL)
{
q = head;
while(q->next)
{
q = q->next;
}
next_insert(q, p);
}
else
{
former_insert(q, p);
}
}
}
else
{
if(p->val > head->val)
{
former_insert(head, p);
head = p;
}
else
{
q = head;
while(q && q->val>=p->val)
{
q = q->next;
}
if(q == NULL)
{
q = head;
while(q->next)
{
q = q->next;
}
next_insert(q, p);
}
else
{
former_insert(q, p);
}
}
}
}
p = head;
while(p)
{
dbg("(%d):%s %d\n", __LINE__, p->name, p->val);
memset(tmp, 0, sizeof(tmp));
snprintf(tmp, sizeof(tmp), "%s %d\n", p->name, p->val);
strncpy(out[j], tmp, strlen(tmp));
j++;
q = p->next;
free(p);
p = q;
}
}
for(i=0; i<j; i++)
{
printf("%s", out[i]);
}
return 0;
}
该博客主要讨论如何使用C++编程实现根据用户输入的成绩序列进行升序或降序排序。程序通过创建链表结构存储(用户,成绩)对,然后根据用户指定的排序方式(0代表从高到低,1代表从低到高)插入新元素。示例展示了如何处理相同成绩的情况,并给出了多组输入数据的处理示例。
511

被折叠的 条评论
为什么被折叠?



