#include<stdio.h> #include<stdlib.h> #include "list.h" //不带头单链表 typedef struct LinkNode{ LinkNode *next; int data; }LinkNode; //头插创建 LinkNode*HeadCreatList() { LinkNode*first =(LinkNode*)malloc(sizeof(LinkNode)); first->next=NULL; int flag = 1; for (int i=0;i<10;i++) { LinkNode*p = (LinkNode*)malloc(sizeof(LinkNode)); p->data =i; p->next =NULL; if(flag) { first = p; flag = 0; }else{ p->next= first; first=p; } } return first; } //尾插创建 LinkNode* TailCreatList(){ LinkNode*first =(LinkNode*)malloc(sizeof(LinkNode)); first->next=NULL; LinkNode*s ; int flag = 1; for (int i=0;i<10;i++) { LinkNode*p = (LinkNode*)malloc(sizeof(LinkNode)); p->data =i; p->next =NULL; if(flag){ first=p; s=p; flag=0; }else{ s->next=p; s=p; } } return first; } //打印 void PrintfLinkList(LinkNode*h) { if (h==NULL) { return; } LinkNode*p=h; while (p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } //长度 int GetLength(LinkNode*head) { if (head==NULL ) { return 0; } int count=0; LinkNode*p=head; while (p!=NULL) { count++; p=p->next; } return count; } //指定节点前插入 LinkNode*InsertNode(LinkNode*h,int elem,int val) { if (h==NULL) { return NULL; } LinkNode*p=h; if (p->data == elem){ LinkNode*q =(LinkNode*)malloc(sizeof(LinkNode)); q->data =val; q->next = p; h=q; return h; } LinkNode *s=p; while(p->next!=NULL) { if (p->next->data == elem){ LinkNode*q =(LinkNode*)malloc(sizeof(LinkNode)); q->data =val; q->next=p->next; p->next=q; return h; } s=p; p=p->next; } if (p->data==elem) { LinkNode*q =(LinkNode*)malloc(sizeof(LinkNode)); q->data =val; q->next = p; s->next =q; } return h; } //删除节点 LinkNode* DeleteNodeList(LinkNode*h,int elem) { if (h==NULL) { return NULL; } if (h->data==elem) { LinkNode*tmp = h; h=h->next; free(tmp); return h; } LinkNode*p=h; LinkNode*q = p; while (p->next!=NULL) { if (p->next->data==elem){ LinkNode*s = p->next; p->next = s->next; free(s); return h; } q=p; p=p->next; } if (p->data==elem){ q->next =NULL; free(p); } return h; } //销毁 void DestroyLinkList(LinkNode **h) { if (h==NULL){ return ; } LinkNode *p = *h; *h=NULL; while(p != NULL) { LinkNode *q =p; p = p->next; free(q); } } //逆置 LinkNode* ReverseLinkList(LinkNode*h) { if (h==NULL||h->next==NULL) { return h; } LinkNode*p =h; LinkNode*q = p->next; while(q!=NULL) { p->next = q->next; q->next=h; h=q; q=p->next; } return h; } //合并两个有序 LinkNode*MergeLinkList(LinkNode*h1,LinkNode*h2) { if (h1==NULL&&h2==NULL) { return NULL; } if (h1==NULL) { return h2; } if (h2==NULL) { return h1; } LinkNode*p1=h1; LinkNode*p2=h2; LinkNode*h3; LinkNode*s; int flag =1; while(p1!=NULL&&p2!=NULL) { if (flag){ if (p1->data>p2->data) { h3=p1; p1=p1->next; }else{ h3=p2; p2=p2->next; } s = h3; flag = 0; }else{ if (p1->data>p2->data) { s->next = p1; p1=p1->next; }else{ s->next = p2; p2=p2->next; } s=s->next; } } if (p1==NULL) { s->next = p2; } if (p2==NULL) { s->next = p1; } return h3; } //是否有环 bool isLinkListHaveCircle(LinkNode*h) { if (h==NULL || h->next == NULL) { return false; } LinkNode*p = h; LinkNode*slow =p; LinkNode*fast =p->next; while(slow!=NULL&&fast!=NULL) { if (slow==fast){ return true; } slow = slow->next; fast = fast->next; if(fast!=NULL){ fast = fast->next; } } return false; }
不带头单链表实现
最新推荐文章于 2023-02-13 23:46:44 发布