当前位置:   article > 正文

20、数据结构相关练习20210202

20、数据结构相关练习20210202

一、请简述栈区和堆区的区别。

1.栈区借助于栈的思想实现,“先进后出”,地址申请从大地址到小地址;堆区借助队列思想实现,“先进先出”,地址申请从小地址到大地址;

2.栈区的内存由计算机自动申请自动释放,堆区由程序员手动申请(malloc)手动释放(free);

3.栈区大小一般在几M,堆区一般在几G;

4.由于栈区较小,可能会出现溢出情况(堆栈溢出),如递归调用较深时,计算机会不断在栈区申请内存。

5.栈区内存申请一般较连续,堆区容易出现片段化。

二、有一个整形数组:arr[ ](数据值由外部输入决定),一个整数型变量:X(也是外部输入决定)要求:

1.删除数组中与x相等的元素

2.不得创建新数组

3.最多只允许使用单层循环

4.无需考虑超出新数组长度后面的元素,所以请返回新数组的长度。

如:{1,2,3,5,7,3,5,9}  x=3  则原数组的有效部分变为:{1,2,5,7,5,9 }。

代码:

  1. #include<stdlib.h>
  2. #include<string.h>
  3. #include<stdio.h>
  4. #define MAXSIZE 8
  5. typedef struct arr
  6. {
  7. int data[MAXSIZE];
  8. int len;
  9. }*pointer;
  10. pointer create_arr()
  11. {
  12. pointer p=(pointer)malloc(sizeof(struct arr));
  13. if(NULL==p)
  14. return NULL;
  15. memset(p->data,0,sizeof(p->data));
  16. p->len=0;
  17. return p;
  18. }
  19. void create(pointer p,int element)
  20. {
  21. if(NULL==p||p->len==MAXSIZE)
  22. { puts("fail or full");
  23. return;
  24. }
  25. p->data[p->len++]=element;
  26. }
  27. void delete_index(pointer p,int i)
  28. {
  29. for(int j=i+1;j<p->len;j++)
  30. {
  31. p->data[j-1]=p->data[j];
  32. }
  33. p->len--;
  34. }
  35. int delete_x(pointer p,int x)
  36. {
  37. for(int i=0;i<p->len;i++)
  38. {
  39. if(x==p->data[i])
  40. {
  41. delete_index(p,i);
  42. i--;
  43. }
  44. }
  45. return p->len;
  46. }
  47. int main(int argc, const char *argv[])
  48. {
  49. pointer p=create_arr();
  50. int element;
  51. for(int i=0;i<MAXSIZE;i++)
  52. {
  53. printf("please enter element %d :",i+1);
  54. scanf("%d",&element);
  55. create(p,element);
  56. }
  57. int x;
  58. printf("please enter delete x:");
  59. scanf("%d",&x);
  60. int l=delete_x(p,x);
  61. for(int i=0;i<l;i++)
  62. {
  63. printf("%d ",p->data[i]);
  64. }
  65. puts("");
  66. return 0;
  67. }

运行结果:

三、请编程实现单链表的头插、头删、尾插、尾删。

代码:

  1. #include<stdlib.h>
  2. #include<string.h>
  3. #include<stdio.h>
  4. typedef struct node //定义链表节点结构体:数据域、指针域
  5. {
  6. int data;
  7. struct node *next;
  8. }*linklist;
  9. linklist create_node()//创建新节点并初始化,返回节点地址
  10. {
  11. linklist s=(linklist)malloc(sizeof(struct node));
  12. if(NULL==s)
  13. return NULL;
  14. s->data=0;
  15. s->next=NULL;
  16. return s;
  17. }
  18. linklist insert_head(linklist head,int element)
  19. {
  20. linklist s=create_node();
  21. if(NULL==s)
  22. {
  23. puts("fail");
  24. return NULL;
  25. }
  26. s->data=element;
  27. if(NULL==head)
  28. {
  29. head=s;
  30. return head;
  31. }
  32. s->next=head;
  33. head=s;
  34. return head;
  35. }
  36. linklist insert_rear(linklist head,int element)
  37. {
  38. linklist s=create_node();
  39. if(NULL==s)
  40. {
  41. puts("fail");
  42. return NULL;
  43. }
  44. s->data=element;
  45. if(NULL==head)
  46. {
  47. head=s;
  48. return head;
  49. }
  50. linklist p=head;
  51. while(p->next)
  52. p=p->next;
  53. p->next=s;
  54. return head;
  55. }
  56. void output(linklist head)
  57. {
  58. linklist p=head;
  59. while(p)
  60. {
  61. printf("%d ",p->data);
  62. p=p->next;
  63. }
  64. puts("");
  65. }
  66. linklist delete_head(linklist head)
  67. {
  68. if(NULL==head)
  69. {
  70. puts("empty");
  71. return head;
  72. }
  73. if(NULL==head->next)
  74. {
  75. free(head);
  76. return NULL;
  77. }
  78. linklist del=head;
  79. head=head->next;
  80. free(del);del=NULL;
  81. return head;
  82. }
  83. linklist delete_rear(linklist head)
  84. {
  85. if(NULL==head)
  86. {
  87. puts("empty");
  88. return head;
  89. }
  90. if(NULL==head->next)
  91. {
  92. free(head);
  93. return NULL;
  94. }
  95. linklist p=head;
  96. while(p->next->next)
  97. p=p->next;
  98. linklist del=p->next;
  99. p->next=NULL;
  100. free(del);del=NULL;
  101. return head;
  102. }
  103. int main(int argc, const char *argv[])
  104. {
  105. linklist head=NULL;//定义单链表头指针并初始化
  106. int len;//根据终端输入的值确定单链表的长度
  107. printf("please enter the length of the linklist:");
  108. scanf("%d",&len);
  109. int element;
  110. for(int i=0;i<len;i++)//循环输入数值,头插或尾插创建链表
  111. {
  112. printf("%d element:",i+1);
  113. scanf("%d",&element);
  114. // head=insert_head(head,element);//头插
  115. head=insert_rear(head,element);//尾插
  116. }
  117. output(head);//遍历
  118. head=delete_head(head);//头删
  119. head=delete_head(head);
  120. output(head);
  121. head=delete_rear(head);//尾删
  122. output(head);
  123. return 0;
  124. }

运行:

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

闽ICP备14008679号