线性表链式存储的实现

来源:互联网 发布:mac不能登录icloud 编辑:程序博客网 时间:2024/04/28 19:01

typedef struct node{  //链表的线性表示的定义

       int data;

       struct node *next;

}listnode,*linklist;

 

linklist CreateLinklist_l(){   //创建链表

       linklist head;

       head = (linklist)malloc(sizeof(listnode));

       head->next = NULL;

       return head;

}

 

void VisitLink(linklist head){    //遍历

       linklist p = head->next;

       while(p){

              printf("%d",p->data);

              p = p->next;

       }

       printf("/n");

}

 

int SearchLinklist(linklist head,int value){    //查找

       linklist p=head->next;

       int pos = 1;

       while(p){

              if(p->data == value){

                      return pos;

              }

              p=p->next;

              pos++;

       }

       return 0;

}

 

int GetLinklist(linklist head,int pos,int *val){      //获得特定位置的值

       linklist p=head;

       if(pos<1){

                printf(ERROR1);

                return -1;

        }

        while(pos--){

              p=p->next;

              if(NULL ==p){

                       printf(ERROR2);

                       return -1;

              }

        }

        *val=p->data;

        return 0;

}

 

void InsertLinklist_2(linklist head,int value){       //插入

        linklist p=head,q;

        while((p->next!=NULL)&&(p->next->data<value)){

                 p=p->next;

        }

        q=(linklist)malloc(sizeof(listnode));

        q->data=value;

        q->next=p->next;

        p->next=q;

        return;

}

 

int DeleteLinklist_1(linklist head,int pos){      //删除

        linklist p=head,q;

        if(pos<1){

                printf(ERROR1);

                return -1;

        }

        while(--pos){

                p=p->next;

                if(NULL==p){

                          printf(ERROR2);

                          return -1;

                 }

                 }

                if(NULL==(q=p->next)){

                          printf(ERROR2);

                          return -1;

                }

                p->next=q->next;

                free(q);

                return 0;

}

 

void DeleteLinklist_2(linklist head,int value){

         linklist p,q;

         p=head;

         q=p->next;

         while(q){

                 if(q->data==value){

                           p->next=q->next;

                           free(q);

                 }

                 else{

                           p=q;

                 }

                 q=p->next;

         }

         return;

}

 

void ListConcat(LinkList ha,LinkList hb,LinkList &hc){      //把链表hb接在ha后面形成的链表hc

        hc=ha;

        p=ha;

        while(p->next)p=p->next;

        p->next=hb;

}//ListCOncat

 

void LinkList_reverse(Linklist *L){       //单链表的逆转操作  链表的就地逆置;为简化算法,假设表长大于2

       Linklist *p,*q;

       p=L->next;

       q=p->next;

       s=p->next;

       p->next=NULL;

       while(s->next){

            q->next=p;

            p=q;

            q=s;

             s=s->next;    //把L的元素逐个插入新表表头

       }

       q->next=p;

       s->next=q;

       L->next=s;

}//LinkList_reverse

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击