实验1-(5) 链表去重 (25 分)
给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。
输入格式:
输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤10 *5 ,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 -1 来表示。
随后 N 行,每行按以下格式描述一个结点:
地址 键值 下一个结点
输出格式:
首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。
输入样例:
00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854
结尾无空行
输出样例:
00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1
结尾无空行
#include<math.h>
#include<stdio.h>
typedef struct shuju//定义存放的结构体
{
int date; //当前地址的数据
int next; //当前地址的下一地址
}shuju;
void print(shuju arr[],int g[],int n);//输出函数
void print(shuju arr[],int g[],int n)
{
for(int i=0;i<n;i++)
{
if(i == n-1)
{
printf("%05d %d -1\n",g[i],arr[g[i]].date);//不足五位的前面补0
}
else
{
printf("%05d %d %05d\n",g[i],arr[g[i]].date,g[i+1]);
}
}
}
int first[100000]; // 存放去重后链表的地址
int f = 0;
int chongfu[100000]; // 判断是否有重复,0代表未重复,1代表已存在
int c = 0;
int quchong[100000]; // 存放第二条链表的地址
int q = 0;
/*
第一个测试点数据
00001 3
00001 1 00002
00002 2 -1
00003 3 00004
若没有被删除的节点,那么不输出副链表(第三个测试点)。
*/
int main()
{
shuju arr[100000];//定义结构体
int head,h; // head与h都为首地址
int n;//一个正整数 N
int ads;// 结点的地址
scanf("%d %d",&head,&n);
h=head;
for(int i=0;i<n;i++)
{
scanf("%d",&ads);
scanf("%d %d",&arr[ads].date,&arr[ads].next);// arr[]括号内不为i 用数组-类似链表
} //输入数据 (乱序) ;链表指针需要在数组排序后输入
while(h!= -1)//有首地址
{
c = abs(arr[h].date); // 取出键值的绝对值
if(!chongfu[c]) 判断该键值是否存在 数组未赋值默认为0 如果chongfu[c]是一个非零值的话,那么()就是假,不执行语句; 如果chongfu[c]的初值为零,那么()就是真,执行语句
{
// 该键值不存在
first[f] = h; // 将该键值的地址放入第一条链表中
f++;//数组下标后移
chongfu[c] = 1; // 将该键值位置置为1,表示已存在
}
else
{
// 该键值存在
quchong[q] = h; // 将该键值地址放入第二条链表中
q++;//数组下标后移
}
h = arr[h].next; // 移向下一位置
}
print(arr,first,f);//调用输出函数
print(arr,quchong,q);
return 0;
}
实验1-(7) 宿舍谁最高?
学校选拔篮球队员,每间宿舍最多有 4 个人。现给出宿舍列表,请找出每个宿舍最高的同学。定义一个学生类 Student,有身高 height,体重 weight 等。
输入格式:
首先输入一个整型数 n (1≤n≤10 *6 ),表示有 n 位同学。
紧跟着 n 行输入,每一行格式为:宿舍号 name height weight。
宿舍号的区间为 [0, 999999], name 由字母组成,长度小于 16,height,weight 为正整数。
输出格式:
按宿舍号从小到大排序,输出每间宿舍身高最高的同学信息。题目保证每间宿舍只有一位身高最高的同学。
注意宿舍号不足 6 位的,要按 6 位补齐前导 0。
输入样例:
7
000000 Tom 175 120
000001 Jack 180 130
000001 Hale 160 140
000000 Marry 160 120
000000 Jerry 165 110
000003 ETAF 183 145
000001 Mickey 170 115
输出样例:
000000 Tom 175 120
000001 Jack 180 130
000003 ETAF 183 145
#include<stdio.h>
#include<string.h>
typedef struct xuesheng{
int room; //每个宿舍号 用int 不用 char[] 因为00001 int输入=1 char不能用==比较
char name[16];//由字母组成,长度小于 16 *要有结束符
int height;
int weight;
}xs; //用来初始化空数组 ***用typedef会有段错误***
xs p[1000000],stu; //放main外 main函数外面开一个数组,他的内存分配在数据区里;如果在main函数内部开数组,内存分配在栈区内。一般来说栈区的内存是比较小的 空间过大会报错!
/*
typedef struct xuesheng{ struct xuesheng{
int room; //每个宿舍号 用int 不用 char[] 因为00001 int输入=1 int room;
char name[16];//由字母组成,长度小于 16 *要有结束符 char name[16];
int height; int height;
int weight; int weight;
}xs; }p[1000000],stu; 在全局变量,不会报错
int main(){
xs p[1000000],stu
} 报错*/
int main(){
int n;//人数
scanf("%d",&n);
int i=0;
while(i<=999999){ //宿舍的区间为 [0, 999999],
p[i].room=i; //不用 char[] 因为00001 int输入=1
//p[i].height=0; 默认为0 可以不赋值
//p[i].weight=0; 默认为0 可以不赋值
i++;
}
//给每个 宿舍都初始化 默认里边有一个身高为0的人 之后才可以经行比较替换
i=0;//初始化i 或者新定义一个变量 int j=0
while(i<n){
scanf("%d %s %d %d",&stu.room,&stu.name,&stu.height,&stu.weight);
if(stu.height>p[stu.room].height){//相同的宿舍号进行比较,p[stu.room]中的stu.room是宿舍号,输入的相同的宿舍号数组p就是一个宿舍里的;
p[stu.room].height=stu.height;//身高传入数组p中;
p[stu.room].weight=stu.weight;//体重传入数组p中;
strcpy(p[stu.room].name,stu.name);//复制姓名 需要用 #include<string.h> 种cpy函数
}
i++;
}
i=0;
for(i;i<999999;i++){
if(p[i].height!=0) //默认都为0 不为0的代表宿舍有人 且为最大身高 输出即可
printf("%06d %s %d %d\n",p[i].room,p[i].name,p[i].height,p[i].weight);
}
return 0;
}
实验1-(1) 求链式线性表的倒数第K项
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
结尾无空行
输出样例:
7
结尾无空行
#include<stdio.h>
int b[1000000];//放全局变量 ,放main里边空间不够会报错
int main(){
int a,n,i=0;
scanf("%d",&a);
while(1){
scanf("%d",&b[i]);
if(b[i]<0) //b[i]==-1 有一个测试点过不去
break;
i++;
}
if(i<a){
printf("NULL");
return 0;
}
printf("%d",b[i-a]);
return 0;
}