当前位置:   article > 正文

数据结构(期末总结)_2、请根据以下算法画出对应图形:(5分)p=(lnode *)malloc(sizeof(lnode

2、请根据以下算法画出对应图形:(5分)p=(lnode *)malloc(sizeof(lnode));p->d

按照我学习的过程更新,所以我会一直更这个文章

第一章:

因为第一章没有什么代码可看的,所以我就拿笔记本写了点笔记出来。

都是一些基本的属于概念,搞清楚其中的关系就行了。

363d054a9eb64cfc8cb359a6a6e24480.jpg

 cf93d1b6092744dca0a8c1e3f1e0182e.jpg

 968d493c42aa466383bb7e952e478948.jpg

第二章 线性表

2.1 等我学会再补

2.2 链表:

 链表节点的定义:

  1. //定义一个结构体
  2. typedef struct LNode
  3. {
  4. int data;
  5. struct LNode* next;
  6. }LNode,* p;

首先我们必须先初始化链表。我看很多人都是把插入数据的过程,跟创建空链表的过程分开来搞。但是我感觉不如像我下面那样一步到位比较方便得了:

by the way我的链表是带头结点的,然后使用的方法是尾插法(头插入法我理解的不够好怕搞错,尾插入比较好理解):

  1. LNode *InitList()
  2. {
  3. int i,temp;
  4. //输入有多少个节点
  5. int n;
  6. printf("请问你要输入多长的链表");
  7. scanf_s("%d", &n);
  8. LNode* head,*tail,*p;
  9. //头节点先指向尾节点
  10. head =tail= (LNode*)malloc(sizeof(LNode));
  11. tail->next = NULL;
  12. for (i = 0; i < n; i++)
  13. {
  14. printf("输入第%d个位置的data", i + 1);
  15. scanf_s("%d", &temp);
  16. p = (LNode*)malloc(sizeof(LNode));
  17. p->data=temp;
  18. p->next = NULL;
  19. tail->next = p;
  20. tail = p;
  21. }
  22. return head;
  23. }

下面是这个链表所要实现的各种功能:

1.返回第i个元素的值 int GetElem(LNode* L, int i)

这个比较简单也比较好理解,找到第i个位置的,只需要把链表从头到尾走i次,然后输出所对应的data就是那个值了

  1. //返回第i个元素的值
  2. int GetElem(LNode* L, int i)
  3. {
  4. int flag = i;
  5. while (flag >= 1)
  6. {
  7. L = L->next;
  8. flag--;
  9. }
  10. printf("链表第%d位置的数值为%d", i, L->data);
  11. return L->data;
  12. }

2.插入一个值 void Insert(LNode* L, int i, int e)

这个函数的目的就是在第i-1个位置的后面接上一个值:

        首先我们开辟一个节点,用于存储新节点的数据

        然后走i-1次找到那个要插入的位置,把新节点接在后面,然后再把新结点的指针指向原来的第i个位置,就好了:

  1. //插入一个值
  2. void Insert(LNode* L, int i, int e)
  3. {
  4. int flag=i;
  5. LNode* temp;
  6. LNode *p;
  7. p = (LNode*)malloc(sizeof(LNode));
  8. p->data = e;
  9. p->next = NULL;
  10. while (flag > 1)
  11. {
  12. L = L->next;
  13. flag--;
  14. }
  15. p->next = L->next;
  16. L->next = p;
  17. }

3.删除第i个节点:void ListDelete(LNode* L, int i)

这里我用的方法是我开一个节点指针,指向的的是原来的那个L的下一个节点,就是我不管L指到哪里,我都有一个tempnode指向它的下一个。

然后开始找第i个位置:我们先让L走到第i-1个位置,然后这时候就像上面所说的tempnode走到了第i个位置了嘛:

然后这个时候我们把第i-1个位置的next指针(L的)指向第i个位置(tempnode的)的next指针,就实现了i-1到i+1,i就被绕过去了,然后free掉i,结束。

  1. void ListDelete(LNode* L, int i)
  2. {
  3. LNode* tempnode;
  4. tempnode = L->next;
  5. int flag = i;
  6. while (flag > 1)
  7. {
  8. L = L->next;
  9. tempnode = tempnode->next;
  10. flag--;
  11. }
  12. L->next = tempnode->next;
  13. free(tempnode);
  14. }

全局代码展示:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. //定义一个结构体
  4. typedef struct LNode
  5. {
  6. int data;
  7. struct LNode* next;
  8. }LNode,* p;
  9. //创造一个链表——尾插入法
  10. LNode *InitList()
  11. {
  12. int i,temp;
  13. //输入有多少个节点
  14. int n;
  15. printf("请问你要输入多长的链表");
  16. scanf_s("%d", &n);
  17. LNode* head,*tail,*p;
  18. //头节点先指向尾节点
  19. head =tail= (LNode*)malloc(sizeof(LNode));
  20. tail->next = NULL;
  21. for (i = 0; i < n; i++)
  22. {
  23. printf("输入第%d个位置的data", i + 1);
  24. scanf_s("%d", &temp);
  25. p = (LNode*)malloc(sizeof(LNode));
  26. p->data=temp;
  27. p->next = NULL;
  28. tail->next = p;
  29. tail = p;
  30. }
  31. return head;
  32. }
  33. //返回第i个元素的值
  34. int GetElem(LNode* L, int i)
  35. {
  36. int flag = i;
  37. while (flag >= 1)
  38. {
  39. L = L->next;
  40. flag--;
  41. }
  42. printf("链表第%d位置的数值为%d", i, L->data);
  43. return L->data;
  44. }
  45. //插入一个值
  46. void Insert(LNode* L, int i, int e)
  47. {
  48. int flag=i;
  49. LNode* temp;
  50. LNode *p;
  51. p = (LNode*)malloc(sizeof(LNode));
  52. p->data = e;
  53. p->next = NULL;
  54. while (flag > 1)
  55. {
  56. L = L->next;
  57. flag--;
  58. }
  59. p->next = L->next;
  60. L->next = p;
  61. }
  62. void ListDelete(LNode* L, int i)
  63. {
  64. LNode* tempnode;
  65. tempnode = L->next;
  66. int flag = i;
  67. while (flag > 1)
  68. {
  69. L = L->next;
  70. tempnode = tempnode->next;
  71. flag--;
  72. }
  73. L->next = tempnode->next;
  74. free(tempnode);
  75. }
  76. //顺序输出链表
  77. void print(LNode *L)
  78. {
  79. LNode* tempnode;
  80. tempnode = L->next;
  81. while (tempnode)
  82. {
  83. printf("%d ", tempnode->data);
  84. tempnode = tempnode->next;
  85. }
  86. }
  87. int main()
  88. {
  89. LNode* list = InitList();
  90. print(list);
  91. Insert(list, 2, 6);
  92. printf("\n");
  93. print(list);
  94. printf("\n");
  95. int a = GetElem(list, 3);
  96. printf("\n");
  97. printf("删除第四个节点:\n");
  98. ListDelete(list, 4);
  99. print(list);
  100. return 0;
  101. }

第三章 栈和队列

3.1栈

先定义一个结构体来表示栈

  1. #include<stdio.h>
  2. #define Maxsize 10000
  3. typedef struct stack
  4. {
  5. int data[Maxsize];
  6. int top;
  7. }stack;

然后,我的这个栈需要完成下面三个功能:

push入栈

pop输出并且出栈

top输出但是不出栈

push入栈

  1. //将栈顶输出,并且栈顶出栈
  2. int pop(stack *a)
  3. {
  4. if(a->top==0)
  5. {
  6. printf("underflow");
  7. return -1;
  8. }
  9. printf("输出栈%d\n",a->data[a->top]);
  10. a->top--;
  11. return a->top;
  12. }

pop输出并且出栈

  1. int pop(stack *a)
  2. {
  3. if(a->top==0)
  4. {
  5. printf("underflow");
  6. return -1;
  7. }
  8. printf("输出栈%d\n",a->data[a->top]);
  9. a->top--;
  10. return a->top;
  11. }

top输出但是不出栈

  1. //栈顶输出,栈顶不出栈
  2. int top(stack *a)
  3. {
  4. if(a->top==0)
  5. {
  6. printf("underflow");
  7. return -1;
  8. }
  9. printf("输出栈但不出栈 % d\n",a->data[a->top]);
  10. return top;
  11. }

全局代码演示:

  1. #include<stdio.h>
  2. #define Maxsize 10000
  3. typedef struct stack
  4. {
  5. int data[Maxsize];
  6. int top;
  7. }stack;
  8. int push(stack *a, int x)
  9. {
  10. if(a->top==Maxsize)
  11. {
  12. printf("overflow");
  13. return -1;
  14. }
  15. a->top++;
  16. a->data[a->top]=x;
  17. printf("入栈%d\n", x);
  18. return a->top;
  19. }
  20. //将栈顶输出,并且栈顶出栈
  21. int pop(stack *a)
  22. {
  23. if(a->top==0)
  24. {
  25. printf("underflow");
  26. return -1;
  27. }
  28. printf("输出栈%d\n",a->data[a->top]);
  29. a->top--;
  30. return a->top;
  31. }
  32. //栈顶输出,栈顶不出栈
  33. int top(stack *a)
  34. {
  35. if(a->top==0)
  36. {
  37. printf("underflow");
  38. return -1;
  39. }
  40. printf("输出栈但不出栈 % d\n",a->data[a->top]);
  41. return top;
  42. }
  43. int main()
  44. {
  45. stack *b;
  46. stack a;
  47. b = &a;
  48. a.top=0;
  49. push(b,1);
  50. push(b,2);
  51. push(b,3);
  52. pop(b);
  53. top(b);
  54. pop(b);
  55. }

3.2队列

  1. #include<stdio.h>
  2. #define N 100000
  3. typedef struct queue
  4. {
  5. int data[N];
  6. int front;
  7. int rear;
  8. } queue;
  9. //初始化列表
  10. void init(queue *myqueue)
  11. {
  12. myqueue->front=0;
  13. myqueue->rear=0;
  14. }
  15. //1为空
  16. //o为不空
  17. int isempty(queue *myqueue)
  18. {
  19. if(myqueue->front==myqueue->rear)
  20. {
  21. return 1;
  22. }
  23. else
  24. {
  25. return 0;
  26. }
  27. }
  28. void EnQueue(queue *myqueue)
  29. {
  30. int num;
  31. if(myqueue->rear==N)
  32. {
  33. printf("error");
  34. }
  35. else
  36. {
  37. myqueue->data[myqueue->rear]=num;
  38. myqueue->rear+=1;
  39. }
  40. }
  41. void DeQueue (queue *myqueue)
  42. {
  43. if(myqueue->front==myqueue->rear)
  44. {
  45. printf("error");
  46. }
  47. else
  48. {
  49. printf("%d\n",myqueue->data[myqueue->front]);
  50. myqueue->front+=1;
  51. }
  52. }

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

闽ICP备14008679号