p.s.个人收录用
题目描述
叶老师想要用链表登记成绩。对于每张试卷有两个信息:学号和成绩。
对于登记成绩,要求学号小的成绩登记在学号大的成绩之前。
叶老师有两种操作:
1 a b:向链表中加入学号为a成绩为b的同学的成绩,题目保证不同的卷子不会有相同的学号。
2 k : 查询当前链表中第k个同学的成绩是多少,题目保证k小于等于当前链表的长度。
请用链表做这道题!
输入
第一行输入一个整数Q,表示操作的个数。
接下来输入Q行,每一行是(1 a b)或者(2 k)格式,分别表示第一种和第二种操作。
1 <= k, Q <= 1000
1 <= a <= 1000000000
1 <= b <= 100
输出
对于每一个第二个操作,输出一个整数表示第k个同学的成绩
样例输入 Copy
3
1 20163266 100
1 20163265 99
2 1
样例输出 Copy
99
提示
请用链表做。
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//双向循环链表
typedef struct ListNode {
struct ListNode* pre;
long long int num;
int score;
struct ListNode* next;
}Node, * linklist;
linklist init()
{
linklist l = (Node*)malloc(sizeof(Node));
if (l != NULL)
{
l->pre = l;
l->next = l;
}
return l;
}
linklist insert(linklist head, int n, int sc)
{
Node* s = (Node*)malloc(sizeof(Node));
if (s != NULL)
{
s->num = n;
s->score = sc;
Node* t = head->next;
while (t != head)
{
if (t->num > s->num)
break;
t = t->next;
}
s->pre = t->pre;
s->next = t;
t->pre->next = s;
t->pre = s;
}
return head;
}
void find(linklist head, int k)
{
Node* t = head;
while (t != NULL)
{
if (k--)
t = t->next;
else
{
printf("%d\n", t->score);
break;
}
}
}
int main()
{
linklist head = init();
int n, b, k;
long long int a;
int q;
scanf("%d", &q);
while (q--)
{
scanf("%d", &n);
if (n == 1)
{
scanf("%lld%d", &a, &b);
insert(head, a, b);
}
else if (n == 2)
{
scanf("%d", &k);
find(head, k);
}
}
}