#include<stdio.h> #include<assert.h> #include<malloc.h> #include<stdlib.h> typedef int Datatype; typedef struct SListNode { Datatype data; struct SListNode*next; }SListNode; void Erase(SListNode*&pHead, SListNode *pos); void PushBack(SListNode*&pHead, Datatype x); void PopBack(SListNode *&pHead); void PrintSlist(SListNode *&PHead); void PushFrot(SListNode*&pHead, Datatype x); void PopFront(SListNode*&pHead); SListNode *Find(SListNode*pHead, Datatype x); SListNode* _BuyNode(Datatype x) { SListNode *temp = (SListNode*)malloc(sizeof(SListNode)); temp->data = x; temp->next = NULL; return temp; } void PushBack(SListNode*&pHead, Datatype x) { //1 空 2 不为空 if (pHead == NULL) { pHead = _BuyNode(x); } else { SListNode *tail = pHead; while (tail->next != NULL) { tail = tail->next; } tail->next = _BuyNode(x); } } void PopBack(SListNode *&pHead) { //1空 2 一个节点 3 多个节点 if (pHead == NULL) { return; } else if (pHead->next == NULL) { free(pHead); pHead = NULL; } else{ SListNode *tail = pHead; SListNode *tem = NULL; while (tail->next != NULL) { tem = tail; tail = tail->next; } free(tail); tem->next = NULL; } } void PrintSlist(SListNode *&PHead) { SListNode*cur = PHead; while (cur != NULL) { printf("%d->", cur->data); cur = cur->next; } printf("NULL\n"); } void PushFrot(SListNode*&pHead, Datatype x) { if (pHead == NULL) { pHead = _BuyNode(x); } else { SListNode *tmp = _BuyNode(x); tmp->next = pHead; pHead = tmp; } } void PopFront(SListNode*&pHead) { //1 空 //2 一个结点 //3 一个以上的节点 if (pHead == NULL) { return; } else if (pHead->next == NULL) { free(pHead); pHead = NULL; } else { SListNode *tmp = pHead; pHead = pHead->next; free(tmp); } } SListNode *Find(SListNode*pHead, Datatype x) { SListNode *tail = pHead; while (tail) { if (tail->data == x) { return tail; } tail = tail->next; } return NULL; } void Erase(SListNode *&pHead, SListNode *pos) { assert(pos); assert(pHead); if (pHead == pos) { pHead = pHead->next; free(pos); return; } SListNode *prv = pHead; while (prv) { if (prv->next == pos) { prv->next = pos->next; free(pos); break; } prv = prv->next; } } SListNode *yuesefu(SListNode*phead, int k) { SListNode *tail = phead; while (1) { if (tail->next == tail) { return tail; } int count = k; while (--count) { tail = tail->next; } SListNode *del = tail->next;//删除节点 tail->data = del->data; tail->next = del->next; free(del); } } //合并两个有序链表,合并后依然有序 SListNode *hebing(SListNode *L1, SListNode *L2) { //1 L1为空 //2 L2 为空 //3 两者都为空 if (L1 == NULL) { return L2; } if (L2 == NULL) { return L1; } SListNode *newhead = NULL; SListNode *phead1 = L1; SListNode *phead2 = L2; if (phead1->data < phead2->data) { newhead = phead1; phead1 = phead1->next; } else { newhead = phead2; phead2 = phead2->next; } SListNode *tail = newhead; while (phead1&&phead2) { if (phead1->data < phead2->data) { tail->next = phead1; tail = tail->next; phead1 = phead1->next; } else { tail->next = phead2; phead2 = phead2->next; tail = tail->next; } } if (phead1) { tail->next = phead1; } else { tail->next = phead2; } return newhead; } //判断链表是否带环 环的长度 SListNode *checkcycle(SListNode * phead) { SListNode * fast = phead; SListNode *slow = phead; while (fast&&fast->next) { slow = slow->next; fast = fast->next->next; if (fast == slow) { return fast; } } return NULL; } int getcyclelength(SListNode *meetNode) { assert(meetNode); SListNode *cur = meetNode; int count = 0; do{ ++count; cur = cur->next; } while (cur != meetNode); return count; } void test6() { SListNode*list1= NULL; SListNode*list2= NULL; PushBack(list1, 1); PushBack(list1, 3); PushBack(list1, 5); PushBack(list1, 7); PushBack(list1, 8); PushBack(list1, 5); PushBack(list1, 7); PushBack(list1, 8); //PushBack(list1, 9); /*PushBack(list2, 2); PushBack(list2, 4); PushBack(list2, 6); PushBack(list2, 8); PushBack(list2, 10);*/ //SListNode *tmp= hebing(list1, list2); //SListNode* ret = Find(list, 6); //ret->next = list; //SListNode*ret2 = yuesefu(list, 3); //printf("%d \n", ret2->data); //PrintSlist(tmp); /*SListNode * cmp=checkcycle(list1); int len = getcyclelength(cmp); printf("%d \n", len);*/ } void test7() { SListNode*list1 = NULL; PushBack(list1, 1); PushBack(list1, 2); PushBack(list1, 3); PushBack(list1, 4); PushBack(list1, 5); PrintSlist(list1); SListNode* ret1 = Find(list1, 5); SListNode* ret2 = Find(list1, 3); ret1->next = ret2; SListNode* ret = checkcycle(list1); printf("%d\n", ret->data); int len = getcyclelength(ret); printf("%d ", len); } int main() { //test1(); test7(); system("pause"); return 0; }
原文:http://10738432.blog.51cto.com/10728432/1731727