当前位置:   article > 正文

华南农业大学数据结构oj 8580 合并链表_华农oj数据结构

华农oj数据结构
  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #define ERROR 0
  4. #define OK 1
  5. #define ElemType int
  6. typedef struct LNode
  7. {
  8. int data;
  9. struct LNode *next;
  10. }LNode,*LinkList;
  11. int CreateLink_L(LinkList &L,int n){
  12. // 创建含有n个元素的单链表
  13. LinkList p,q; // p为当前数据内容,q为下一个数据的地址
  14. //LinkList L只改变结构体的内容,不改变L的地址
  15. //而LinkList *L会改变L的地址
  16. int i;
  17. ElemType e;
  18. L = (LinkList)malloc(sizeof(LNode));//生成新结点作为头结点,即L为头结点
  19. //动态内存申请样例:p = (int *)malloc(sizeof(int));
  20. L->next = NULL; // 给头结点下一个结点接上NULL,以NULL隔开,让头结点成为旧结点
  21. q = (LinkList)malloc(sizeof(LNode));//给予新结点q内存空间
  22. q = L;//新结点q变成旧结点(为下一个新结点的生成铺垫条件,即q结点为null后的结点)
  23. for (i=0; i<n; i++)
  24. { //生成n个元素的单链表
  25. scanf("%d", &e);
  26. p = (LinkList)malloc(sizeof(LNode)); // 给新节点p分配空间
  27. p -> data = e; //把e赋给结点p的数据域
  28. q -> next = p; //旧结点的指针指向新节点 把新旧结点链接起来
  29. p -> next = NULL; //新节点指向空,因为后面还没有元素加入
  30. q = p; //把新结点p变为旧结点q,为新的结点加入而做铺垫
  31. }
  32. return OK;
  33. }
  34. int ListInsert_L(LinkList &L, int i, ElemType e) { // 算法2.9
  35. LNode * newNode = (LinkList)malloc(sizeof(LNode)); //定义新节点newNode并赋予内存,LNode为定义新节点
  36. newNode->data=e;//将e值放入newNode结点中
  37. newNode->next=NULL;//给newNode接上一个为空的新结点
  38. int num=0;//记录链表有多少个结点
  39. LNode * p = L->next;//头节点的下一个结点位置定义为结点p
  40. while(p!=NULL)//p非空时
  41. {
  42. p=p->next;//指向p的下一个结点
  43. num++;//结点数+1
  44. }
  45. if(i>num+1)//当输入的第i个位置超出了链表长度时
  46. {
  47. return ERROR;//返回ERROR值
  48. }
  49. p= L;//将p定位为头节点
  50. int j=0;
  51. while(j<i-1&&p!=NULL) //查找第i-1个结点,p指向该结点
  52. {
  53. p=p->next;
  54. j++;
  55. }
  56. newNode->next=p->next;//将i-1结点的下一个位置(即i)赋给新结点的下一个位置
  57. p->next=newNode;//将新结点放入i-1结点的下一个位置(即i)
  58. return OK;
  59. }
  60. int ListDelete_L(LinkList &L, int i, ElemType &e) { // 算法2.10
  61. // 在带头结点的单链线性表L中第i个位置之前插入元素e
  62. // 请补全代码
  63. LNode * newNode = (LinkList)malloc(sizeof(LNode)); //定义新节点newNode并赋予内存,LNode为定义新节点
  64. newNode->data=e;//将e值放入newNode结点中
  65. newNode->next=NULL;//给newNode接上一个为空的新结点
  66. int num=0;//记录链表有多少个结点
  67. LNode * p = L->next;//头节点的下一个结点位置定义为结点p
  68. while(p!=NULL)//p非空时
  69. {
  70. p=p->next;//指向p的下一个结点
  71. num++;//结点数+1
  72. }
  73. if(i>num+1)//当输入的第i个位置超出了链表长度时
  74. {
  75. return ERROR;//返回ERROR值
  76. }
  77. p= L;//将p定位为头节点
  78. int j=0;
  79. while(j<i-1&&p!=NULL) //查找第i-1个结点,p指向该结点
  80. {
  81. p=p->next;
  82. j++;
  83. }
  84. newNode->next=p->next;//将i-1结点的下一个位置(即i)赋给新结点的下一个位置
  85. p->next=newNode;//将新结点放入i-1结点的下一个位置(即i)
  86. return OK;
  87. }
  88. int LoadLink_L(LinkList &L)
  89. {
  90. // 单链表遍历并输出数据
  91. LinkList p = L->next;
  92. if(p==NULL)
  93. printf("The List is empty!");
  94. else
  95. {
  96. while(p!=NULL)
  97. {
  98. printf("%d ",p->data);
  99. p=p->next;//指针下移
  100. }
  101. }
  102. printf("\n");
  103. return OK;
  104. }
  105. int MergeList_Sq(LinkList &A, LinkList &B, LinkList &C)
  106. {
  107. LinkList pA = A->next; //让pA指针指向A链表第一个有效节点(首节点,即头结点的下一个结点)
  108. LinkList pB = B->next; //让pB指针指向B链表第一个有效节点(首节点, 即头结点的下一个结点)
  109. LinkList pC = C; //让pC指针指向C链表的头结点
  110. while (pA != NULL && pB != NULL)//当pA指针与pB的指针的指向都非空时
  111. {
  112. if (pA->data > pB->data)//如果A链表的首结点大于B链表的首结点
  113. {
  114. pC->next = pB; //让pB指针指向的B表中的对应结点接到C上
  115. pB = pB->next; //指针后移动
  116. pC = pC->next; //指针后移动
  117. }
  118. else//否则
  119. {
  120. pC->next = pA; //让pA的指针指向的B表中的对应结点接到C上
  121. pA = pA->next; //指针后移动
  122. pC = pC->next; //指针后移动
  123. }
  124. }
  125. if (pA == NULL)//如果指针pA指向的链表A结点为空
  126. {
  127. while (pB != NULL)//当指针pB指向的链表B结点非空时
  128. {
  129. pC->next = pB;//让pB指针指向的对应B表中的对应结点接到C上
  130. pB = pB->next;//指针后移
  131. pC = pC->next;//指针后移
  132. }
  133. }
  134. else
  135. {
  136. while (pA != NULL)//当指针pA指向的链表B结点非空时
  137. {
  138. pC->next = pA;//让pB指针指向的对应B表中的对应结点接到C上
  139. pA = pA->next;//指针后移
  140. pC = pC->next;//指针后移
  141. }
  142. }
  143. return OK; //别忘了
  144. }
  145. int main()
  146. {
  147. LinkList A;
  148. LinkList B;
  149. int a,n;
  150. scanf("%d",&n);
  151. CreateLink_L(A,n);
  152. scanf("%d",&a);
  153. CreateLink_L(B,a);
  154. printf("List A:");
  155. LoadLink_L(A);
  156. printf("List B:");
  157. LoadLink_L(B);
  158. LinkList C = (LinkList)malloc(sizeof(LNode));
  159. C->next = NULL; // 先建立一个带头结点的单链表
  160. MergeList_Sq(A, B, C);
  161. printf("List C:");
  162. LoadLink_L(C);
  163. }

以上我加过注释后的代码,望同学们易读好学,有改进之处可以提出来!有错误之处也望大神指出!

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

闽ICP备14008679号