实验一:线性表的创建与访问算法设计 (链表去重 、宿舍谁最高)C语言数组实现

实验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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值