1 // 2 // main.cpp 3 // 链表 4 // 5 // Created by loglian on 2020/4/23. 6 // Copyright © 2020 loglian. All rights reserved. 7 // 8 9 #include <iostream> 10 #include <stdio.h> 11 #define MAXSIZE 100 12 typedef struct LNode *List; 13 typedef int ElementType; 14 struct LNode{ 15 ElementType Data; 16 List Next; //next为指针 17 }; 18 struct LNode L; 19 List Ptrl; 20 21 //求表长 遍历 22 int length(List Ptrl)//Ptrl头节点 23 { 24 List p=Ptrl; //p指向表的第一个节点 25 int j=0; 26 while (p){ 27 p=p->Next; 28 j++; 29 } 30 return j; 31 } 32 33 34 //查找:按序号查找 O(n) 35 List FindKth(int K,List Ptrl) 36 { 37 List p=Ptrl; //p表头 38 int i=1; 39 while ( p!=NULL && i<K ) 40 { 41 p=p->Next; 42 i++; 43 } 44 if(i==K)return p; 45 else return NULL; 46 } 47 //查找:按值查找 48 List Find (ElementType X,List Ptrl) 49 { 50 List p=Ptrl; 51 while(p!=NULL && p->Data!=X) //链表不空 52 p=p->Next; 53 return p; 54 } 55 56 57 //插入 平均2/n 58 //在i-1个结点后插入一个新的x结点 PtrL=Insert(…) 直接返回获得新的头指针 59 List Insert(ElementType X,int i,List Ptrl) 60 { 61 List p,s; 62 if(i==1) //新节点插入在表头 63 { 64 s=(List)malloc(sizeof(struct LNode)); //申请并填装新结点 65 s->Data=X; 66 s->Next=Ptrl; //s指向第一个结点 67 return s; //返回新的头指针 68 } 69 p=FindKth(i-1, Ptrl); //查找第i-1结点 70 if(p==NULL){ 71 printf("参数i错误"); 72 return NULL; 73 }else{ 74 s=(List)malloc(sizeof(struct LNode)); 75 s->Data = X; 76 s->Next = p->Next; //注意顺序 77 p->Next = s; 78 return Ptrl;//返回头指针 79 } 80 } 81 82 //删除 平均2/n 83 84 List Delete(int i,List Ptrl) 85 { 86 List p,s; 87 if(i==1) //删除第一个节点 88 { 89 s=Ptrl; 90 if(Ptrl!=NULL) Ptrl=Ptrl->Next; //ptrl本身为空 91 else return NULL; 92 free(s); //释放被删除的结点 93 return Ptrl; 94 } 95 p=FindKth(i-1, Ptrl); 96 if(p==NULL) 97 {printf("第%d个结点不存在",i-1); return NULL;} 98 else if(p->Next==NULL) 99 {printf("第%d个结点不存在",i); return NULL;} 100 else { 101 s=p->Next; //s指向第i个结点 102 p->Next=s->Next; //删除 103 free(s); //释放删除结点空间 104 return Ptrl; 105 } 106 }