《数据结构》实验课期末考试

#代码是直接从提交的答题卡上复制的,可能格式啥有错
#运行结果当时要求用自己的姓名就不粘过来了

题目:
1、(30分)利用自己的姓名拼音字母建立一个单链表(带头结点),注意,如果链表存在已知字母,则不能插入。输入格式样例:
请输入姓名:LIMING
建立的单链表输出为:L->I->M->N->G->^
注:
(1)输入自己姓名拼音,大写全拼,中间无空格;
(2)如果链表长度小于5(不含),则在单链表尾部,反复插入单个字母A,直到链表长度等于5为止。
2、在1所建立的单链表基础上,采用两种方法实现如下功能:查找单链表倒数第2个元素,并输出元素值。
(1)(30分)第一种方法(常规思路):求出单链表长度(Length),然后通过idx = Length-N+1(N为倒数位置序号),得到idx值,再从头遍历单链表,直到遍历到idx即可。
对应实现函数void GetReverseValue1(LinkList L,int n,char &value)//value为返回的查找元素值
(2)(40分)第二种方法:要求不能采用第一种方法的思路(第一种方法需采用两次遍历,即一次用于求单链表长度,另外一次用于查找idx),且仅采用一次遍历即可得到倒数第2个元素的值。
对应实现函数void GetReverseValue2(LinkList L,int n,char &value)//value为返回的查找元素值
最终输出样式为(以LIMING为例):
第一种方法(常规思路)单链表倒数第2个元素值为:N
第二种方法单链表倒数第2个元素值为:N

源码:

#include<iostream>
#include<string>

using namespace std;

typedef struct Lnode {
	char data;
	struct Lnode* next;
}Lnode,*Linklist;

//建立单链表
bool initlist(Linklist& L,string n) {
	Linklist p,s;
	L = new Lnode;
	L->next = NULL;
	p = L;
	for (char i : n) {
		s = new Lnode;
		s->data = i;
		p->next = s;
		p = p->next;
	}
	p->next = NULL;
	return true;
}

//显示单链表
void display(Linklist L) {
	Linklist p=L->next;
	while (p!= NULL) {
		cout << p->data << "->";
		p = p->next;
	}
	cout << "^"<< endl;
}

void GetReverseValue1(Linklist L, int n, char& value) {
	//求单链表长度
	Linklist p = L->next;
	int len=0;
	while (p != NULL) {
		len++;
		p = p->next;
	}
	//计算序号
	int idx;
	idx = len - n + 1;
	//查找元素
	p = L;
	for (int i = 0; i < idx; i++) {
		p = p->next;
	}
	value = p->data;
}

void GetReverseValue2(Linklist L, int n, char& value) {
	Linklist p = L, s = L;
	//s指针先移动k步
	for (int i = 0; i < n; i++) {
		s = s->next;
	}
	//一次遍历
	while (s != NULL) {
		s = s->next;
		p = p->next;
	}
	value = p->data;
}

int main() {
	Linklist L;
	string name;
	char value1,value2;
	cout << "输入姓名:";
	cin >> name;
	if (initlist(L, name)) {
		cout << "建立的单链表输出为:" ;
		display(L);
		cout << endl;
	};
	GetReverseValue1(L,2,value1);
	cout << "第一种方法(常规思路)单链表倒数第2个元素值为:" << value1 << endl;
	GetReverseValue2(L, 2, value2);
	cout << "第二种方法单链表倒数第2个元素值为:" << value2 << endl;
	return 0;
}
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值