求链式线性表的倒数第K项
求链式线性表的倒数第K项
一、目的
-掌握malloc
-掌握vector
二、实验内容与设计思想
求链式线性表的倒数第K项
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7
函数相关伪代码
1.定义malloc/一个vector
2.malloc用链表/vector动态输入
3.i来计算链表个数
函数代码
1.malloc链表实现(c)
#include<stdio.h>
#include<stdlib.h>
struct num{
int data;
struct num *next;
};
int main()
{
int a,i=0,n,d;
struct num *s,*head,*t;
scanf("%d",&a);
head=(struct num*)malloc(sizeof(struct num));
head->next=NULL;
t=head;
while(1){
scanf("%d",&n);
if(n<0){
break;
}
s=(struct num*)malloc(sizeof(struct num));
if (s == NULL) {
printf("内存分配失败\n");
return 1;
}
s->data=n;
s->next=NULL;
t->next=s;
t=s;
i++;
}
struct num *p = head->next;
struct num *q = head->next;
for(d=0;d<i-a;d++){
if (q->next == NULL) {
printf("NULL\n");
return 0;
}
q=q->next;
}
if(i<a){
printf("NULL");
goto l1;
}
printf("%d\n", q->data);
l1: while(head->next!=NULL){
p=head;
head=head->next;
free(p);
}
return 0;
}
2.vector实现(c++)
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int>n;
int i=0,l,a;
cin>>l;
while(1){
cin>>a;
if(a>=0){
n.push_back(a);
i++;
}else{
break;
}
}
if(l>i){
cout<<"NULL";
}else{
cout<<n[i-l];
}
return 0;
}
三、实验使用环境
以下请根据实际情况编写
- 操作系统:Windows 11专业版
- 编程语言:C++,C
- 开发工具:[Visual stdio 2022,DevC++]
四、实验步骤和调试过程
求链式线性表的倒数第K项
本机运行截图

五、实验小结
遇到的问题及解决方法:
- 问题:malloc的链接问题
- 解决方法:引入头指针
实验体会和收获:
这两个代码段均实现读取一系列整数并输出指定位置的整数,但实现方式不同。
第一个代码段使用c语言中的malloc,用链表形式来实现代码,首先读取位置整数a,然后读取非负整数至负数为止,存储于链表,并用i的累加来表示链表数,为后期查找方便点。遍历链表,输出从尾部数第a个整数的值。若a大于链表长度,则输出"NULL",但代码需要使用goto语句,不利于代码维护且还要写代码来实现链表,最后还要遍历释放空间,代码复杂。
所以第二个代码段使用了c++语言,采用vector,数据库自带的可以动态存储,不需要再写代码来实现,读取位置整数l,同样读取非负整数至负数,存储于n。直接访问vector里的元素,输出指定位置的整数。若l大于向量长度,输出"NULL"。此实现更加简单,利用了vector直接访问特性,效率较高,且无需手动管理内存,最后查找可以直接使用n.size()来表示元素的储存长度,不需要在输入时用i来计数。

浙公网安备 33010602011771号