当前位置:   article > 正文

数据结构:单链表逆置_设计算法实现将单链表中数据逆置的操作

设计算法实现将单链表中数据逆置的操作

实验要求:

写出将单链表逆置的算法。即令单链表的第一个结点变为最后一个结点,第二个结点变为倒数第二个结点,…,最后一个结点变为第一个结点。

依次从键盘读入数据,逆序建立链表L;

逆置链表L(创建新的链表New保存逆置的结点);


代码解析:

主函数int main():

定义链表的长度n;

调用CreateList函数创建长度为n的链表;

调用InvertList函数将链表内元素转置并输出;

定义链表的结构体类型为LNode,规定结点的数据域和结点的指针域

定义函数struct LNode *CreatList(int n)逆位序创建链表并输出所创建的链表的元素值。

定义需要创建的链表元素个数n;

建立一个带头结点的单链表;

逆序位输入指定元素个数的链表元素数值;

输入逆序位建立链表的链表元素;

定义函数void InverList(struct LNode *L)转置链表内元素并输出。

建立一个带头结点的新链表r;

q指向链表的第一个元素;

开辟新结点s,将q的值赋给s;

令s->next为NULL并使其成为r的后续结点;

利用while循环,将q不断后移,指向链表的后续元素。开辟新结点p将q的值         赋给p,将p插入结点s和结点i中间;

令s的指针指向p;

输出转置后的链表;


实验代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //定义链表类型
  4. struct LNode{
  5. int data; //结点的数据域
  6. struct LNode *next; //结点的指针域
  7. };
  8. //创建逆序链表
  9. struct LNode *CreatList(int n)
  10. {
  11. struct LNode *L,*p;
  12. printf("请输入逆序创建链表的元素的个数:\n"); //确定链表元素的个数
  13. scanf("%d",&n);
  14. L = (struct LNode*)malloc(sizeof(struct LNode));
  15. L->next = NULL; //建立一个带头结点的单链表
  16. printf("请输入逆序链表元素:\n");
  17. while(n--){ //逆序位输入n个元素的数值
  18. p=(struct LNode*)malloc(sizeof(struct LNode));
  19. scanf("%d",&p->data ); //输入指定元素个数的链表元素数值
  20. p->next = L->next ;
  21. L->next =p;
  22. }
  23. printf("输出链表中的元素:\n"); //直接输出所创建的逆序链表
  24. while(p!=NULL)
  25. {
  26. if(p->next ==NULL)
  27. printf("%d\n",p->data );
  28. else
  29. printf("%d\t",p->data );
  30. p=p->next ;
  31. }
  32. return L;
  33. }
  34. //转置链表内元素并输出
  35. void InvertList(struct LNode *L)
  36. {
  37. struct LNode *p,*q,*r,*s,*t;
  38. r = (struct LNode*)malloc(sizeof(struct LNode));
  39. s = (struct LNode*)malloc(sizeof(struct LNode));
  40. r->next=NULL; //建立一个带头结点新链表
  41. q=L->next; //q指向链表第一个元素
  42. s->data=q->data;
  43. s->next=NULL;
  44. r->next=s;
  45. while(q->next !=NULL)
  46. {
  47. q=q->next;
  48. p = (struct LNode*)malloc(sizeof(struct LNode));
  49. p->data=q->data;
  50. p->next=s;
  51. r->next=p;
  52. s=p;
  53. }
  54. printf("输出转置后的链表:\n");
  55. t=r->next;
  56. while(t!=NULL) //直接输出转置后的链表
  57. {
  58. printf("%d\t",t->data );
  59. t=t->next ;
  60. }
  61. printf("\n");
  62. }
  63. //主函数
  64. int main()
  65. {
  66. int n;
  67. struct LNode *L;
  68. L=CreatList(n);
  69. InvertList(L);
  70. }

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

闽ICP备14008679号