#include<stdlib.h> #include<stdio.h> typedef struct LinkNode{ LinkNode *next; int data; }LinkNode; //头插创建 LinkNode* HeadCreat() { LinkNode*head = (LinkNode*)malloc(sizeof(LinkNode)); head->next= NULL; for (int i=0;i<10;i++) { LinkNode*p = (LinkNode*)malloc(sizeof(LinkNode)); p->data = i;//+rand()%10; p->next= head->next; head->next=p; } return head; } //尾插创建 LinkNode* TailCreat() { LinkNode*head = (LinkNode*)malloc(sizeof(LinkNode)); head->next = NULL; LinkNode*q=head; for (int i=0;i<10;i++) { LinkNode*p = (LinkNode*)malloc(sizeof(LinkNode)); p->data = i;//+rand()%10; p->next = NULL; q->next = p; q = p; } return head; } void PrintfList(LinkNode*h) { if (h==NULL||h->next==NULL) { return; } LinkNode*p=h->next; while (p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } void TailInsert(LinkNode*h,int i){ if (h==NULL){ return; } LinkNode*q=h; while(q->next!=NULL){ q=q->next; } LinkNode*p = (LinkNode*)malloc(sizeof(LinkNode)); p->data = i; p->next=NULL; q->next = p; } LinkNode* ReverseList1(LinkNode*head) { if (head==NULL||head->next==NULL) { return NULL; } LinkNode*p = head->next; LinkNode*q ; head->next =NULL; while(p!=NULL) { q=p->next; p->next=head->next; head->next = p; p = q; } return head; } LinkNode* ReverseList(LinkNode*head) { if (head==NULL||head->next==NULL) { return NULL; } LinkNode*p = head->next; LinkNode*q = p->next; LinkNode*s; p->next = NULL; while(q!=NULL) { s = q->next; q->next=p; p = q; q = s; } head->next = p; return head; } int GetLengthOfList(LinkNode*head) { if (head==NULL||head->next==NULL) { return -1; } int count=0; LinkNode*p=head->next; while (p!=NULL) { count++; p=p->next; } return count; } bool InsertIndex(LinkNode*head,int idx,int val) { int len = GetLengthOfList(head); if (head==NULL||idx<0||idx>=len) { return false; } int i=0; LinkNode*p=head; while(p->next!=NULL) { if (i==idx) { LinkNode*q = (LinkNode*)malloc(sizeof(LinkNode)); q->data = val; q->next= p->next; p->next= q; return true; } i++; p=p->next; } return false; } bool DeleteNode(LinkNode*head,int idx) { int len = GetLengthOfList(head); if (head==NULL||idx<0||idx>len) { return false; } int i=0; LinkNode*p=head; while(p->next!=NULL) { if (idx==i){ LinkNode*q = p->next; p->next=q->next; free(q); return true; } i++; p=p->next; } return false; } bool IsEmpty(LinkNode*head) { if (head==NULL||head->next ==NULL){ return true; } return false; } void DetroyNode(LinkNode*head) { if (head==NULL||head->next ==NULL){ return ; } LinkNode*p=head->next; while(p!=NULL) { LinkNode*q=p; head->next = p->next; free(q); p=p->next; } free(head); } // 合并两个有序 LinkNode* MergeList(LinkNode*h1,LinkNode*h2) { if (h1==NULL&&h2==NULL) { return NULL; } if (h1==NULL) { return h2; } if (h2==NULL) { return h1; } LinkNode*p=h1->next; LinkNode*q=h2->next; LinkNode*s = h1; LinkNode*s1 = s; while(p!=NULL&&q!=NULL) { if (p->data<q->data) { s->next=p; p=p->next; }else{ s->next=q; q=q->next; } s=s->next; } if (p==NULL) { s->next=q->next; } if (q==NULL) { s->next=p->next; } return s1; } bool IsHaveCirle(LinkNode*head) { if (head==NULL||head->next==NULL) { return false; } LinkNode *slow = head->next; LinkNode*fast = slow->next; while( fast !=NULL){ if (fast==slow) { return true; } slow=slow->next; fast = fast->next; if (fast!=NULL) { fast = fast->next; } } return false; } int main() { printf("hello \n"); LinkNode*list1 = HeadCreat(); LinkNode*list2 = TailCreat(); PrintfList(list1); PrintfList(list2); LinkNode list3; for (int i=0;i<10;i++){ TailInsert(&list3,i*2); } PrintfList(&list3); LinkNode *list4= MergeList(list2,&list3); PrintfList(list4); if (!IsHaveCirle(&list3)){ printf("环\n"); } printf("%d\n",GetLengthOfList(list1)); if (InsertIndex(list1,-1,99)) { PrintfList(list1); }else{ printf("插入失败1 \n"); PrintfList(list1); } if (DeleteNode(list1,0)) { PrintfList(list1); } if (InsertIndex(list1,20,99)) { PrintfList(list1); }else{ printf("插入失败2\n"); PrintfList(list1); } if ( InsertIndex(list1,0,99)) { PrintfList(list1); }else{ printf("插入失败3\n"); PrintfList(list1); } if ( InsertIndex(list1,4,99)) { PrintfList(list1); }else{ printf("插入失败4\n"); PrintfList(list1); } LinkNode*list6 = ReverseList1(list1); PrintfList(list6); if (IsEmpty(list1)){ printf("空"); }else{ printf("非空 \n"); } DetroyNode(list1); if (IsEmpty(list1)){ printf("空 \n"); } return 0; }
带头单链表实现
最新推荐文章于 2024-05-12 15:40:28 发布