当前位置:   article > 正文

数据结构-第二章线性表-算法设计题6_6)设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结

6)设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结

算法设计题

问题描述

        6.设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结点。

算法分析

        此题的关键点在于:在遍历的时候利用指针pmax记录值最大的结点的位置。

算法步骤

        1.初始时指针pmax指向首元结点,然后在遍历过程中,用pmax依次和后面的结点进行比较,发现大者则用pmax指向该结点。

算法描述

        主要代码

  1. ElemType MAX(LinkList &L)
  2. {
  3. //确定单链表中值最大的结点
  4. if(L->next==NULL)
  5. return NULL;
  6. LinkList pmax=L->next;
  7. LinkList p=L->next->next;
  8. while(p!=NULL)
  9. {
  10. if(p->data>pmax->data)
  11. {
  12. pmax=p;
  13. }
  14. p=p->next;
  15. }
  16. return pmax->data;
  17. }

        完整代码

  1. //******************************数据结构-第二章线性表-算法设计题6******************************//
  2. #include <stdio.h>
  3. #include <iostream>
  4. #define OK 1
  5. #define ERROR 0
  6. using namespace std;
  7. typedef int Status;
  8. //定义单链表的结构类型
  9. typedef int ElemType;
  10. //------单链表的存储结构-----//
  11. typedef struct LNode
  12. {
  13. ElemType data; //结点的数据域
  14. struct LNode *next; //结点的指针域,指向下一个指针
  15. }LNode,*LinkList; // LNode是结点,LinkList是链表,LinkList为指向结构体LNode的指针类型
  16. //------单链表的初始化-----//
  17. //【算法步骤】//
  18. //1.生成新结点作为头结点,用头指针L指向头结点。
  19. //2.头结点的指针域置空。
  20. Status InitList(LinkList &L)
  21. {
  22. //构造一个空的单链表L
  23. L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 或L=(LinkList)malloc(sizeof(LNode))
  24. L->next=NULL; //头结点的指针域置空
  25. return OK;
  26. }
  27. //------后插法创建单链表-----//
  28. //【算法步骤】//
  29. //1.创建一个只有头结点的空链表。
  30. //2.尾指针r初始化,指向头结点。
  31. //3.根据创建链表包括的元素个数n,循环n次执行以下操作:
  32. //生成一个新结点*P;
  33. //输入元素值赋给新结点*p的数据域;
  34. //将新结点*p插入到尾结点*r之后;
  35. //尾指针r指向新的尾结点*p。
  36. void CreateList_R(LinkList &L,int n)
  37. {
  38. //正位序输入n个元素的值,建立带表头结点的单链表L
  39. L=new LNode; //或L=(LinkList)malloc(sizeof(LNode))
  40. L->next=NULL; //先建立一个带头结点的空链表
  41. LinkList r=L; //尾指针r指向头结点
  42. for(int i=0;i<n;++i)
  43. {
  44. LinkList p=new LNode; //生成新结点*p
  45. cin>>p->data; //输入元素值赋给新结点*p的数据域
  46. p->next=NULL;
  47. r->next=p; //将新结点*p插入到尾结点*r之后
  48. r=p; //r指向新的尾结点*p
  49. }
  50. }
  51. //------单链表的插入-----//
  52. //【算法步骤】//
  53. //将值为e的新结点插入到表的第i个结点的位置上,即插入到结点ai-1与ai之间,具体插入过程如图所示,步骤如下:
  54. //1.查找结点ai-1并由指针p指向该结点。
  55. //2.生成一个新结点*s。
  56. //3.将新结点*s的数据域置为e。
  57. //4.将新结点*s的指针域指向结点ai。
  58. //5.将结点*p的指针域指向新结点*s。
  59. Status ListInsert(LinkList &L,int i,ElemType e)
  60. {
  61. //在带头结点的单链表L中第i个位置插入值为e的新结点
  62. LinkList p=L;
  63. int j=0;
  64. while(p && (j<i-1))
  65. {
  66. p=p->next; //查找第i-1个结点,p指向该结点
  67. ++j;
  68. }
  69. if(!p||j>i-1) return ERROR; //i>n+1或者i<1
  70. LinkList s=new LNode; //生成新结点*s
  71. s->data=e; //将结点*s的数据域置为e
  72. s->next=p->next;//将结点*s的指针域指向结点ai
  73. p->next=s; //将结点*p的指针域指向结点*s
  74. return OK;
  75. }
  76. //------求链表的最大值-----//
  77. //【算法步骤】//
  78. //1.初始时指针pmax指向首元结点,然后在遍历过程中,
  79. //用pmax依次和后面的结点进行比较,发现大者则用pmax指向该结点。
  80. ElemType MAX(LinkList &L)
  81. {
  82. //确定单链表中值最大的结点
  83. if(L->next==NULL)
  84. return NULL;
  85. LinkList pmax=L->next;
  86. LinkList p=L->next->next;
  87. while(p!=NULL)
  88. {
  89. if(p->data>pmax->data)
  90. {
  91. pmax=p;
  92. }
  93. p=p->next;
  94. }
  95. return pmax->data;
  96. }
  97. //------打印单链表函数-----//
  98. void PrintList(LinkList L)
  99. {
  100. printf("当前单链表中所有元素为:");
  101. for(LinkList p=L->next;p!=NULL;p=p->next)
  102. {
  103. if(p->next==NULL)
  104. printf("%d",p->data);
  105. else
  106. printf("%d->",p->data);
  107. }
  108. printf("\n");
  109. }
  110. //------创建单链表函数------//
  111. void CreateList(LinkList &L)
  112. {
  113. int n;
  114. printf("请输入要创建的单链表L的长度:");
  115. scanf("%d",&n);
  116. printf("请依次输入%d个数(空格隔开):",n);
  117. CreateList_R(L,n);
  118. printf("单链表L创建成功!\n");
  119. PrintList(L);
  120. }
  121. //------单链表插入函数------//
  122. void InsertList(LinkList &L)
  123. {
  124. int i,e;
  125. printf("请输入要插入的位置:");
  126. scanf("%d",&i);
  127. printf("请输入要在第%d个位置插入的数据元素:",i);
  128. scanf("%d",&e);
  129. bool flag=ListInsert(L,i,e);
  130. if(flag)
  131. {
  132. printf("元素%d插入单链表成功!\n", e);
  133. PrintList(L);
  134. }
  135. else
  136. {
  137. printf("元素%d插入单链表失败!\n",e);
  138. }
  139. }
  140. //------求链表的最大值------//
  141. void MaxList(LinkList L)
  142. {
  143. int n=MAX(L);
  144. printf("L表中最大的结点的数据元素:%d\n",n);
  145. }
  146. //------主函数-----//
  147. int main()
  148. {
  149. int n;
  150. LinkList L;
  151. InitList(L);
  152. CreateList(L);
  153. MaxList(L);
  154. }

        运行结果

  1. 请输入要创建的单链表L的长度:5
  2. 请依次输入5个数(空格隔开):3 9 6 12 5
  3. 单链表L创建成功!
  4. 当前单链表中所有元素为:3->9->6->12->5
  5. L表中最大的结点的数据元素:12
  6. --------------------------------
  7. Process exited after 12.45 seconds with return value 0
  8. 请按任意键继续. . .

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/825788
推荐阅读
相关标签
  

闽ICP备14008679号