1. 创建并操作循环链表
【问题描述】输入n个整数,创建一个双向循环链表进行存储。这些整数从第二个开始,递增有序(设a2<a3<...<an) (ai为第i个整数)。试编写程序,创建双向循环链表,依次将输入的整数存储在该链表的各节点中。然后,将第一个结点删除并插入链表中的适当位置,使整个链表递增有序。
【输入形式】先输入整数的个数,再输入整数列。
【输出形式】以整数递增的顺序,依次输出双向循环链表各个节点存储的整数。
【样例输入】5 3 1 2 4 5
【样例输出】1 2 3 4 5
【样例说明】输入数据的第一个数是整数的个数,其后是整数列,该整数列从第二个开始,递增有序,数据间以空格分开。
【评分标准】根据输入的数据创建双向循环链表,并把原来部分有序的链表处理成有序的链表并输出。
参考代码:
#include<iostream>
using namespace std;
typedef struct DXLNode {
int data;
struct DXLNode* next;
struct DXLNode* prior;
}DXLNode, * Link;
void CreatList_W(Link& l, int n) {
l = (Link)malloc(sizeof(DXLNode));
l->next = l;
l->prior = l;
Link q = l;
for (int i = 0; i < n; i++) {
Link p = (Link)malloc(sizeof(DXLNode));
cin >> p->data;
l->prior = p;
q->next = p;
p->prior = q;
p->next = l;
q = q->next;
}
}
int main() {
int n;
cin >> n;
Link l;
CreatList_W(l, n);
Link p = l->next;
int e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
for (Link q = l->next; q != l; q = q->next) {
if (q->data <= e && q->next == l) {
Link s = (Link)malloc(sizeof(DXLNode));
s->data = e;
s->prior = q;
q->next = s;
s->next = l;
break;
}
else if (q->data <= e && q->next->data >= e) {
Link s = (Link)malloc(sizeof(DXLNode));
s->data = e;
q->next->prior = s;
s->next = q->next;
s->prior = q;
q->next = s;
break;
}
else if (q->data > e && q->prior == l) {
Link s = (Link)malloc(sizeof(DXLNode));
s->data = e;
s->next = q;
s->prior = l;
l->next = s;
q->prior = s;
break;
}
}
for (Link q = l->next; q != l; q = q->next) {
printf("%d ", q->data);
}
}
2. 创建链表
【问题描述】定义一个包含学生某门课程成绩信息(学号、成绩)的单链表,读入相应的成绩数据来完成学生成绩信息表的创建。然后,逐行输出每个学生的成绩信息。
【输入形式】输入1行,包括3位同学的成绩信息(学号、成绩)。学号、成绩之间用半角逗号“,”分隔,相邻同学的成绩信息用空格分隔。其中学号取最后三位,成绩为整数类型。
【输出形式】总计输出3行,每个学生成绩信息占一行,学号、成绩用半角逗号“,”分隔,其中学号取后三位。
【样例输入】201,98 202,94 203,89
【样例输出】
[num=201,score=98]
[num=202,score=94]
[num=203,score=89]
【样例说明】输入三组学生成绩数据,创建一个单链表,并输出。
【评分标准】存储结构采用单链表,否则得零分。
参考代码:
#include<cstdio>
#include<iostream>
using namespace std;
typedef struct Student {
int num;
int score;
struct Student* next;
}Student, * LinkList;
int main() {
char c;
LinkList l = (LinkList)malloc(sizeof(Student));
l->next = NULL;
LinkList q = l;
for (int i = 0; i < 3; i++) {
LinkList p = (LinkList)malloc(sizeof(Student));
cin >> p->num >> c >> p->score;
q->next = p;
q = p;//尾插,指针q指向新的结点
}
LinkList p = l->next;
for (int i = 0; i < 3; i++) {
if (p->num == 1 || p->num == 2 || p->num == 3) {//特判001 002 003..
switch (p->num) {
case 1:
printf("[num=%s,score=%d]\n", "001", p->score);
break;
case 2:
printf("[num=%s,score=%d]\n", "002", p->score);
break;
case 3:
printf("[num=%s,score=%d]\n", "003", p->score);
break;
}
}
else
printf("[num=%d,score=%d]\n", p->num, p->score);
p = p->next;
}
}
3. 数组主元素(2013考研题)
【问题描述】
已知一个整数序列A长度为N其中若存在a且a的个数大于N/2则称为A的主元素
例如0 5 5 3 5 7 5 5 则为主元素 5
又如0 5 5 3 5 1 5 7则中没有主元素。
假设中的个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出的主元素。若存在主元素则输出该元素否则输出-1
【输入形式】
一个整数数组
【输出形式】
主元素
【样例输入】
0 5 5 3 5 7 5 5
【样例输出】
5
【样例说明】
【评分标准】
参考代码:
#include<iostream>
using namespace std;
int getmax(int a[], int n) {
int max = a[0];
int i;
for (i = 0; i < n; i++) {
if (a[i] > max)
max = a[i];
}
return max;
}
int main() {
int n;
char c;
int a[1000];
int N = 0;
while (1) {
cin >> n;
c = getchar();
a[N++] = n;
if(c!=' ')
break;
}
/*对于希冀平台还可以这样
while (cin >> n) {
a[N++] = n;
}*/
int* b = new int[N];//存储输入的数,动态数组
for (int i = 0; i < N; i++) {
b[i] = a[i];
}
int m = getmax(b, N) + 1;//得到数组最大值,作为计数数组的长度
//count[]记录每个数字出现次数
int *count=new int[m];
for (int i = 0; i < m; i++) {
count[i] = 0;
}
for (int i = 0; i < N; i++) {
count[b[i]]++;
}
int t = count[0];
int max = 0;
for (int i = 0; i < m; i++) {
if (count[i] > t) {
t = count[i];
max = i;
}
}
if (t > N / 2)
printf("%d", max);
else
printf("%d", -1);
return 0;
}
4. 合并链表
【问题描述】
两个非降序链表的并集,例如将链表1->2->3 和 2->3->5 并为 1->2->3->5,只能输出结果,不能修改两个链表的数据。
【输入形式】
第一行为第一个链表的各结点值,以空格分隔。
第二行为第二个链表的各结点值,以空格分隔。
【输出形式】
合并好的链表,以非降序排列,值与值之间以空格分隔。
【样例输入】
4 7 10 34
1 4 6 29 34 34 52
【样例输出】
1 4 6 7 10 29 34 52
【评分标准】
要使用链表实现,否则不能得分。
参考代码:
#include<iostream>
using namespace std;
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * Link;
int compare(Link l1, Link l2) {
Link p1 = l1->next;
Link p2 = l2->next;
int e = p1->data;
int flag1 = 0,flag2=0;
while (p1 && p2) {
if (e != p1->data) {
flag1 = 1;
}
if (p1->data != p2->data) {
flag2 = 1;
break;
}
p1 = p1->next;
p2 = p2->next;
}
return flag1 + flag2;
}
void select(Link& l1, Link& l2, Link& l3) {
Link p1 = l1->next;
Link p2 = l2->next;
Link p3;
l3 = p3 = l1;
while (p1 && p2) {
if (p1->data < p2->data) {
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else if(p1->data > p2->data){
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
else {
p3->next = p1;
p3 = p1;
p1 = p1->next;
Link q = p2->next;
free(p2);
p2 = q;
}
if (p1&&p1->next&&(p3->data == p1->data)) {
p3->next = p1->next;
}
else if (p2&&p2->next && (p3->data == p2->data)) {
p3->next = p2->next;
}
else
p3->next = p1 ? p1 : p2;
}
}
int main() {
int n;
char c;
Link l1 = (Link)malloc(sizeof(LNode));
l1->next = NULL;
Link q1 = l1;//q1用于指向新插入的结点
Link l2 = (Link)malloc(sizeof(LNode));
l2->next = NULL;
Link q2 = l2;
while (cin >> n) {
Link p1 = (Link)malloc(sizeof(LNode));
p1->data = n;
q1->next = p1; q1 = p1;//尾插
c = getchar();
if (c != ' ')
break;
}
q1->next = NULL;
while (cin >> n) {
Link p2 = (Link)malloc(sizeof(LNode));
p2->data = n;
q2->next = p2; q2 = p2;//尾插
c = getchar();
if (c != ' ')
break;
}
q2->next = NULL;
Link p1 = l1->next; Link p2 = l2->next;
Link l3 = (Link)malloc(sizeof(LNode));
if (compare(l1, l2) == 0) {
Link p= (Link)malloc(sizeof(LNode));
p->data = p1->data;
l3->next = p;
p = NULL;
}
else
select(l1, l2, l3);
Link q4 = l3->next;
while (q4) {
printf("%d ", q4->data);
q4 = q4->next;
}
}
5. 输出单链表倒数第K个结点值
【问题描述】输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个节点。
【输入形式】输入第一位为K值,其后接一串以空格分隔的整型值。
【输出形式】输出为倒数第K个结点的值,若无,则输出Not Found
【样例输入】3 13 45 54 32 1 4 98 2
【样例输出】4
【样例说明】K值为3,则输出链表倒数第3个结点的值,为4;数据输入间以空格隔开
【评分标准】本题要综合输出正确性及使用的数据结构。需由输入数据构建单链表。不使用链表的将不得分。
参考代码:
#include<iostream>
using namespace std;
typedef struct LNode {
int data;
struct LNode* next;
}LNode,*Link;
int main() {
int n,t=-1;//t记录除了头节点之外的个数
char c;
Link l = (Link)malloc(sizeof(LNode));
l->next = NULL;
Link q = l;
while (cin >> n) {
if (t == -1)
l->data = n;
else {
Link p = (Link)malloc(sizeof(LNode));
p->data = n;
q->next = p;
q = p;
}
t++;
if (c = getchar() != ' ')
break;
}
Link p=l;
int j = 0,f=0;
for (int i = 0; i < t; i++) {
p = p->next;
j++;
if (j == t - l->data+1) {
printf("%d", p->data);
f = 1;//当找到时,f=1
break;
}
}
//while (p) {//尾部指针如果不指向NULL会报错内存访问冲突
// p=p->next;
// j++;
// if (j == t - l->data + 1) {
// printf("%d", p->data);
// f = 1;//当找到时,f=1
// break;
// }
//}
if (f == 0)
printf("Not Found");
}