链表
https://blog.csdn.net/Endeavor_G/article/details/80552680
https://blog.csdn.net/qq_39993896/article/category/7319745
这个详细
顺序表:https://blog.csdn.net/lady_killer9/article/details/82695770
//链表 typedef struct LNode *List; struct LNode{ ElementType Data; List Next; }; struct LNode L; List PtrL; //建有头结点链表 List creatlist(int n){ List Head,Node,End; Head = (List)malloc(sizeof(struct LNode)); End = Head; for(int i=0; i<n; i++){ Node = (List)malloc(sizeof(struct LNode)); scanf("%d",&Node->Data); End->Next = Node; End = Node; } End->Next = NULL; return Head; } //建立无头结点链表 List creat0list(int n){ List Head,End; ElementType X; while(n--){ scanf("%d",&X); List Node; Node = (List)malloc(sizeof(struct LNode)); Node->Data = X; Node->Next = NULL; if(Head == NULL){ Head = Node; End = Head; } else{ End->Next = Node; End = Node; } } return Head; } //求表长 int Length(List PtrL){ List p = PtrL; int j = 0; while(p){ p = p->Next; j++; } return j; } //查找,按序号第k个 List FindKth(int K,List Ptrl){ List p = PtrL; int i = 1; while(p && i<K){ p = p->Next; i++; } if(i == K) return p; else return NULL; } //查找,按值查找 List Find(ElementType X,List PtrL){ List p = PtrL; while(p && p->Data != X){ p = p->Next; } return p; } //插入,插在第i-1结点的后面 List Insert(ElementType X,int i,List PtrL){ List s,p; if(i == 1){ s=(List)malloc(sizeof(struct LNode)); s->Data=X; s->Next = PtrL; return s; } p = FindKth(i-1,PtrL); if(p == NULL){ printf("位置错误"); return NULL: } else{ s = (List)malloc(sizeof(struct LNode)); s->Data = X; s->Next = p->Next; p->Next = s; return PtrL; } } //删除,删第i个结点 List Delete(int i,List PtrL){ List s,p; if(i == 1){ s = PtrL; if(PtrL != NULL) PtrL = PtrL->Next; else return NULL; free(s); return Ptrl; } p = FindKth(i-1,List PtrL); if(p == NULL){ printf("位置错误");//删的前面的没有 return NULL; } else if(p->Next == NULL){ printf("位置错误");//要删的没有 return NULL; } else{ s = p->Next; p->Next = s->Next; free(s); return PtrL; } }
双向链表
typedef struct LNode *List; struct LNode{ int Data; List Next; List Prex; }; struct LNode L; List PtrL; //建无表头 List creatlist(int n){ List Head=NULL,Node=NULL,End=NULL; int X; while(n--){ scanf("%d",&X); List Node; Node = (List)malloc(sizeof(struct LNode)); Node->Data = X; Node->Next = NULL; Node->Prex = End; if(Head == NULL){ Head = Node; End = Head; } else{ End->Next = Node; End = Node; } } return Head; } List FindKth(int K,List PtrL){ List p = PtrL; int j = 1; while(p && j<K){ p = p->Next; j++; } if(j == K){ return p; } else return NULL; } //前遍历 void printlist(List PtrL){ List p = PtrL; while(p != NULL){ printf("%d\t",p->Data); p = p->Next; } } //插入,把X插在i-1结点后 List Insert(int X,int i,List PtrL){ List s,p; if(i == 1){ s = (List)malloc(sizeof(struct LNode)); s->Data = X; s->Next = PtrL; s->Prex = NULL; return s; } p = FindKth(i-1,PtrL); if(p == NULL){ printf("位置错误\n"); return NULL; } else if(p->Next == NULL){ s = (List)malloc(sizeof(struct LNode)); s->Data = X; s->Next = p->Next; s->Prex = p; p->Next = s; return PtrL; } else{ s = (List)malloc(sizeof(struct LNode)); s->Data = X; p->Next->Prex = s; s->Next = p->Next; s->Prex = p; p->Next = s; return PtrL; } } //删除,删第i个 List Deletelist(int i,List PtrL){ List p; p = PtrL; i--; while(i--){ p = p->Next; } p->Prex->Next = p->Next; p->Next->Prex = p->Prex; free(p); return PtrL; }