首页 > 代码库 > C实现之单链表是否相交
C实现之单链表是否相交
1 # include<stdio.h> 2 struct Slist{ 3 int size; 4 struct sl* head; 5 }; 6 struct sl{ 7 int k; 8 struct sl* next; 9 }; 10 typedef struct Slist Sl; 11 typedef struct sl sl; 12 void init(Sl* m,int k){ 13 sl* p = (sl *)malloc(sizeof(sl)); 14 p->k = k; 15 p->next = NULL; 16 m->head =p; 17 m->size = 1; 18 } 19 20 sl* add(Sl* m,int key ){ 21 sl* p=(sl *)malloc(sizeof(sl)); 22 sl* q = (sl *)malloc(sizeof(sl)); 23 p->k = key; 24 p->next = NULL; 25 q = m->head; 26 while (q->next != NULL) 27 q = q->next; 28 q->next = p; 29 m->size++; 30 return p; 31 } 32 33 void FanZhuan(Sl* m){ //链表反转 34 35 sl* p = m->head; 36 sl* q =NULL; 37 sl* r =NULL; 38 while (p->next!=NULL){ 39 40 q = p->next; 41 p->next = r; 42 r = p; 43 p = q; 44 } 45 q->next = r; 46 m->head = q; 47 } 48 49 void BianLi(Sl* m){ //遍历链表 50 51 sl* a = m->head; 52 printf(" \n"); 53 while (a != NULL){ 54 printf("%d",a->k); 55 a = a->next; 56 } 57 } 58 59 sl* CheckLoop(Sl* m){ //测试是否有环 60 sl* a = m->head; 61 sl* b = m->head; 62 while (b!=NULL){ 63 a = a->next; 64 if (b->next == NULL) 65 return NULL; 66 if (b->next->next == NULL) 67 return NULL; 68 b = b->next->next; 69 if (a == b) 70 return a; 71 } 72 return NULL; 73 } 74 75 int NloopCheck(Sl* f,Sl* n){ //两者均无环,测相交 76 sl* k1 = f->head; 77 sl* k2 = n->head; 78 while (k1->next!=NULL) 79 { 80 k1 = k1->next; 81 } //取得表k1的最后一个节点 82 while (k2 != NULL){ 83 k2 = k2->next; 84 if (k2 == k1) 85 { 86 return 1; 87 } 88 } 89 return 0; 90 } 91 92 void Check(Sl*t1,Sl*t2){ //测试是否相交 93 94 sl* Y1 = CheckLoop(t1); //先测两个表的每个表是否有环 95 sl* Y2 = CheckLoop(t2); 96 // if (Y1 != NULL) 97 // printf("The first have loop!\n"); 98 // if (Y2 != NULL) 99 // printf("The second have loop!"); 100 101 int y1 = (Y1 != NULL);102 int y2 = (Y2 != NULL);103 int y = y1 + y2;104 int yes = 0;105 sl* test = NULL;106 switch (y)107 {108 case 0: //均无环109 printf("\n Two have no loop!");110 yes = NloopCheck(t1, t2);111 break;112 113 case 1: //一个有环,一个没有114 printf("\n One Have loop!");115 yes = 0;116 break;117 118 case 2: //两者都有环119 printf("\n Two have loop!");120 test = t2->head;121 while (1)122 {123 if (test == Y2)124 {125 yes = 1;126 break;127 }128 test = test->next;129 }130 break;131 default:132 break;133 }134 135 if (yes == 1)136 printf("\n Have intersection!");137 else138 printf("\n Don‘t have intersection!");139 }140 141 void main(){142 Sl* t1 = (Sl*)malloc(sizeof(Sl)); //创建带环链表t1143 t1->size=0;144 t1->head = NULL;145 init(t1,8);146 add(t1, 3);147 add(t1, 2);148 sl* t1Start=add(t1, 1); //loop start!149 add(t1, 0);150 add(t1, 9);151 sl* t2Start=add(t1, 10);152 t2Start->next = t1Start; //Add loop!153 154 Sl* t2 = (Sl*)malloc(sizeof(Sl)); //创建链表t2与t1相交155 t2->size = 0;156 t2->head = NULL;157 init(t2, 8);158 add(t2, 3);159 add(t2, 2);160 sl* w2 = add(t2, 1);161 w2->next = t2Start;162 163 164 Sl* t3 = (Sl*)malloc(sizeof(Sl)); //创建五环链表t3165 t3->size = 0;166 t3->head = NULL;167 init(t3, 8);168 add(t3, 3);169 add(t3, 2);170 sl* w3= add(t3, 1);171 add(t3,7);172 add(t3,27);173 174 Sl* t4 = (Sl*)malloc(sizeof(Sl)); //创建链表t4与t3相交175 t4->size = 0;176 t4->head = NULL;177 init(t4, 8);178 add(t4, 3);179 add(t4, 2);180 sl* w4 = add(t4, 1);181 w4->next = w3;182 183 Sl* t5 = (Sl*)malloc(sizeof(Sl)); //创建链表t5,不与上相交184 t5->size = 0;185 t5->head = NULL;186 init(t5, 8);187 add(t5, 53);188 add(t5, 42);189 printf("\n SingList t1 and t2:");190 Check(t1, t2);191 printf("\n\n SingList t3 and t4:");192 Check(t3, t4);193 printf("\n\n SingList t1 and t3:");194 Check(t3, t1);195 printf("\n\n SingList t3and t5:");196 Check(t5, t3);197 198 199 200 201 system("pause");202 }
执行效果图如下:
C实现之单链表是否相交
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。