当前位置:   article > 正文

C语言之链表练习题_c语言链表练习题

c语言链表练习题

第3关:单链表逆置

本关需要你设计一个程序,实现单链表的逆置。

单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果,但还是有着不小的差别。

头插法

逆置链表初始为空,表中节点从原链表中依次“删除”,再逐个插入逆置链表的表头(即“头插”到逆置链表中),使它成为逆置链表的“新”的第一个结点,如此循环,直至原链表为空。

就地逆置法

先假定有一个函数,可以将以head为头结点的单链表逆序,并返回新的头结点。利用这个函数对问题进行求解:将链表分为当前表头结点和其余部分,递归的过程就是,先将表头结点从链表中拆出来,然后对其余部分进行逆序,最后将当前的表头结点链接到逆序链表的尾部。递归的终止条件就是链表只剩一个节点时,直接返回这个节点。

编程要求

  • 按程序提示输入并创建一个单链表,带有头结点;

  • 可自定义链表的长度,可自定义链表储存的数据类型,注意更改相应的输入输出方式;

  • 实现单链表的逆置,直观地输出结果。

效果如下: 输入:

6 1 212 7 8 0 2

输出:

链表逆置前的数据:

1 212 7 8 0 2

链表逆置后的数据:

2 0 8 7 212 1

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. typedef struct node {
  5. int data;
  6. struct node *next;
  7. }NODE,* PNODE;
  8. //函数声明
  9. PNODE CreateList();
  10. PNODE ReverseList(PNODE phead);
  11. //CreateList函数创建链表
  12. PNODE CreateList(){//先用尾插法创建一个链表
  13. //创建一个头节点
  14. PNODE phead=(PNODE)malloc(sizeof(NODE));
  15. phead->next=NULL;
  16. int len=0,i,val;
  17. PNODE p=phead;//p指向头指针phead
  18. scanf("%d",&len);//输入的链表长度len
  19. for(i=0;i<len;i++){
  20. scanf("%d",&val);
  21. PNODE pNew=(PNODE)malloc(sizeof(NODE));//动态分配一个新节点pNew
  22. p->next = pNew;
  23. pNew->data = val;
  24. p=pNew;
  25. }
  26. p->next=NULL;
  27. return phead;
  28. }
  29. //将单链表逆置的ReverseList函数
  30. PNODE ReverseList(PNODE phead){
  31. PNODE pHEAD=(PNODE)malloc(sizeof(NODE));//新建一个头节点pHEAD,然后依次读入phead中的每一个数据,并用头插法创建一个以pHEAD为头指针的新链表
  32. pHEAD->next=NULL;
  33. PNODE p = pHEAD->next;
  34. int val;
  35. PNODE q=phead->next;//p指向头指针phead
  36. while(q!=NULL){
  37. val = q->data;
  38. q= q->next;
  39. PNODE pNew=(PNODE)malloc(sizeof(NODE));//动态分配一个新节点pNew
  40. pHEAD->next = pNew;
  41. pNew->data = val;
  42. pNew->next = p;
  43. p=pNew;
  44. }
  45. //p=pHead;
  46. return pHEAD;
  47. }
  48. void ShowList(PNODE phead){//遍历链表
  49. PNODE p = phead->next;
  50. while(p!=NULL){
  51. printf("%d ",p->data);
  52. p=p->next;
  53. }
  54. printf("\n");
  55. return;
  56. }
  57. int main(void)
  58. {
  59. PNODE phead;
  60. phead = CreateList();
  61. printf("链表逆置前的数据:\n");
  62. ShowList(phead);
  63. phead = ReverseList(phead);
  64. printf("链表逆置后的数据:\n");
  65. ShowList(phead);
  66. return 0;
  67. }

第2关:统计单链表中的节点数

本小节需要你统计单链表中的节点数。

相关知识

根据上一关我们知道怎么创建单链表了,那么这一关让我们巩固一下单链表的知识。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

编写程序,从键盘输入一串整数以及整数的个数,以单链表形式存储起来,计算单链表中结点的个数,输出单链表的数据及结点的个数。

效果如下

输入:

8

12367802

输出:

12367802

8

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. typedef struct node {
  5. int data;
  6. struct node *next;
  7. }NODE,*PNODE;
  8. int length_list(PNODE phead){
  9. int cnt=0;
  10. PNODE p = phead;
  11. while(p->next!=NULL){
  12. cnt++;
  13. p=p->next;
  14. }
  15. return cnt;
  16. }
  17. PNODE CreatList(){
  18. //创建头节点
  19. PNODE phead = (PNODE)malloc(sizeof(NODE));
  20. phead->next = NULL;
  21. int i,len;
  22. scanf("%d",&len);
  23. PNODE p = phead;
  24. for(i=0;i<len;i++){
  25. PNODE pNew = (PNODE)malloc(sizeof(NODE));
  26. scanf("%d",&pNew->data);
  27. p->next = pNew;
  28. pNew->next = NULL;
  29. p=pNew;
  30. }
  31. return phead;
  32. }
  33. void ShowList(PNODE phead){
  34. PNODE p = phead->next;
  35. while(p!=NULL){
  36. printf("%d ",p->data);
  37. p=p->next;
  38. }
  39. printf("\n");
  40. return;
  41. }
  42. int main(void)
  43. {
  44. PNODE phead;
  45. phead = CreatList();
  46. ShowList(phead);
  47. printf("%d", length_list(phead));
  48. return 0;
  49. }

第1关:建单向链表

本关需要你建立一个带头结点的单向链表。

相关知识

什么是链表?链表和二叉树是C语言数据结构的基础和核心。

链表有多种形式,它可以是单链接的或者双链接的,可以是已排序的或未排序的,可以是循环的或非循环的。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

键盘输入一组元素,建立一个带头结点的单向链表(无序)。

要求:

  • 输入整数的长度以及整数;

  • 输出无序的单向链表。

效果如下:

输入:

5

1 23 4 8 9

输出:

1 23 4 8 9

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct node {
  4. int data;
  5. struct node *next;
  6. }NODE,* PNODE;
  7. PNODE CreateList(){
  8. //创建一个头节点
  9. PNODE phead=(PNODE)malloc(sizeof(NODE));
  10. phead->next=NULL;
  11. int len=0,i,val;
  12. PNODE p=phead;//p指向头指针phead
  13. scanf("%d",&len);//输入的链表长度len
  14. for(i=0;i<len;i++){
  15. scanf("%d",&val);
  16. PNODE pNew=(PNODE)malloc(sizeof(NODE));//动态分配一个新节点pNew
  17. p->next = pNew;
  18. pNew->data = val;
  19. pNew->next = NULL;
  20. p=pNew;
  21. }
  22. //p=pHead;
  23. return phead;
  24. }
  25. void ShowList(PNODE phead){//遍历链表
  26. PNODE p = phead->next;
  27. while(p!=NULL){
  28. printf("%d ",p->data);
  29. p=p->next;
  30. }
  31. return;
  32. }
  33. int main(void)
  34. {
  35. PNODE phead;
  36. phead = CreateList();
  37. ShowList(phead);
  38. return 0;
  39. }

如果文章对你有用的话,可不可以点一个赞鼓励我呢^o^

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

闽ICP备14008679号