数据结构实验1

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");
}

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值