链表

来源:互联网 发布:java 对url encode 编辑:程序博客网 时间:2024/06/15 14:02
#include <stdio.h>#include <malloc.h> typedef struct LNode *List;struct LNode{    int Data;    List Next;};struct LNode L;List PtrL;/*用链表遍历的方法求表长,时间复杂度为O(n)*/ int Length(List PtrL){    List p=PtrL;//p指向表的第一个结点     int j=0;    while(p){        p=p->Next;//当前p指的是第j个结点         j++;    }    return j;} /*按序号查找*/List FindKth(int K,List PtrL){    List p=PtrL;    int i=1;    while(p!=NULL&&i<K){        p=p->Next;        i++;    }       if(i=K)     return p;    else     return NULL;}/*按值查找*/List Find(int X,List PtrL){    List p=PtrL;    while(p!=NULL&&p->Data!=X){        p=p->Next;    }    return p; } /*插入操作,平均查找次数n/2*/ List Insert(int X,int i,List PtrL){    List p,s;    if(i==1){   //新结点插在表头         s=(List)malloc(sizeof(struct LNode)); //申请、填装表头         s->Data=X;        s->Next=PtrL;        return s;  //返回新表头指针     }    p=FindKth(i-1,PtrL);//查找第i-1个结点    if(p=NULL){          //第i-1个结点不存在,不能插入         printf("参数错误");         return NULL;     } else{        s=(List)malloc(sizeof(struct LNode)); //申请,填装结点         s->Data=X;        s->Next=p->Next;  //新结点插入在第i-1个结点后面         p->Next=s;        return PtrL;    } }/*删除操作*/ List Delete(int i,List PtrL){    List p,s;    if(i==1){  //如果要删除的是第一个结点         s=PtrL; //s指向第一个结点         if(PtrL!=NULL) //从链表中删除          PtrL=PtrL->Next;        else         return NULL;    }    p=FindKth(i-1,PtrL);  //查找第i-1个结点     if(p==NULL){        printf("第%d个结点不存在",i-1);         return NULL;    }else if(p->Next==NULL){        printf("第%d个结点不存在",i);        return NULL;    }else{        s=p->Next; //s指向第i个结点         p->Next=s->Next; //从链表中删除         free(s);  //释放被删除的结点         return PtrL;     } }  /*输出整个顺序表*/void ListTraverse(List PtrL){    List p;    p=PtrL;    while(p)    {        printf("%5d",p->Data);        p=p->Next;    }    return;} int main() {    return 0; }