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

缺乏、安全感 2023-01-01 07:51 248阅读 0赞

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

题目:
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

源码:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. typedef struct Lnode {
  5. char data;
  6. struct Lnode* next;
  7. }Lnode,*Linklist;
  8. //建立单链表
  9. bool initlist(Linklist& L,string n) {
  10. Linklist p,s;
  11. L = new Lnode;
  12. L->next = NULL;
  13. p = L;
  14. for (char i : n) {
  15. s = new Lnode;
  16. s->data = i;
  17. p->next = s;
  18. p = p->next;
  19. }
  20. p->next = NULL;
  21. return true;
  22. }
  23. //显示单链表
  24. void display(Linklist L) {
  25. Linklist p=L->next;
  26. while (p!= NULL) {
  27. cout << p->data << "->";
  28. p = p->next;
  29. }
  30. cout << "^"<< endl;
  31. }
  32. void GetReverseValue1(Linklist L, int n, char& value) {
  33. //求单链表长度
  34. Linklist p = L->next;
  35. int len=0;
  36. while (p != NULL) {
  37. len++;
  38. p = p->next;
  39. }
  40. //计算序号
  41. int idx;
  42. idx = len - n + 1;
  43. //查找元素
  44. p = L;
  45. for (int i = 0; i < idx; i++) {
  46. p = p->next;
  47. }
  48. value = p->data;
  49. }
  50. void GetReverseValue2(Linklist L, int n, char& value) {
  51. Linklist p = L, s = L;
  52. //s指针先移动k步
  53. for (int i = 0; i < n; i++) {
  54. s = s->next;
  55. }
  56. //一次遍历
  57. while (s != NULL) {
  58. s = s->next;
  59. p = p->next;
  60. }
  61. value = p->data;
  62. }
  63. int main() {
  64. Linklist L;
  65. string name;
  66. char value1,value2;
  67. cout << "输入姓名:";
  68. cin >> name;
  69. if (initlist(L, name)) {
  70. cout << "建立的单链表输出为:" ;
  71. display(L);
  72. cout << endl;
  73. };
  74. GetReverseValue1(L,2,value1);
  75. cout << "第一种方法(常规思路)单链表倒数第2个元素值为:" << value1 << endl;
  76. GetReverseValue2(L, 2, value2);
  77. cout << "第二种方法单链表倒数第2个元素值为:" << value2 << endl;
  78. return 0;
  79. }

发表评论

表情:
评论列表 (有 0 条评论,248人围观)

还没有评论,来说两句吧...

相关阅读