数据结构基础3_带头结点的单链表

来源:互联网 发布:佐治亚州知乎 编辑:程序博客网 时间:2024/06/05 04:09
#include<iostream>#include<stdio.h>#include<stdlib.h>typedef int ElemType;typedef int Status;#define true 1#define false 0typedef struct Lnode{        ElemType data;        struct Lnode *next;        }*link,*Position;typedef struct{        link head,tail;        int len;        }linklist;        Status Makenode(link &p,ElemType e)        {               p=(link)malloc(sizeof(Lnode));               if(!p)               {                     return false;                     }                     p->data=e;                     return true;                     }         void Freenode(link &p)         {              free(p);              p=NULL;              }          Status Initlist(linklist &L)          {             link p;             p=(link)malloc(sizeof(Lnode));             if(!p)             {                   return false;                   }                   p->next=NULL;                   L.head=L.tail=p;                   L.len=0;                   return true;                   }            Status Clearlist(linklist &L)            {                   link p,q;                   p=L.head->next;                   L.head->next=NULL;                   while(p!=NULL)                   {                                 q=p->next;                                 free(p);                                 p=q;                                 }                                 L.tail=L.head;                                 L.len=0;                                 return true;                                 }                                        Status Destorylist(linklist &L)             {                Clearlist(L);                free(L.head);                L.head=L.tail=NULL;                L.len=0;                return true;                }                Status Insfirst(linklist &L,link h,link s)                {                       h=L.head;                    s->next=h->next;                    h->next=s;                                        L.len++;                    return true;                    }                Status Delfirst(linklist &L,link h,link q)                {                        h=L.head;                       if(h->next==NULL)                       {                                       return false;                                       }                                       q=h->next;                                       h->next=q->next;                                       free(q);                                       L.len--;                                       return true;                                       }                Status Append(linklist &L,link s)                {                   int n=1;                  link p;                  p=L.head;               while(p->next!=NULL){                  p=p->next;}                   p->next=s;                   while(s->next!=NULL)                   {                       s=s->next;                       n++;                       }                       L.tail=s;                       L.len+=n;                       }                 Status Remove(linklist &L,link &q)                 {                        link p;                        p=L.head;                        if(L.head==L.tail)                        {                                          return false;                                          }                         q=L.head;                         while(q->next!=NULL){                              q=q->next;}                         while(p->next!=q)                         {                              p=p->next;                              }                              p->next=q->next;                              L.tail=p;                              L.len--;                              return true;                              }                 Status Insbefore(linklist &L,link &p,link s)                 {                     link q=L.head;                     while(q->next!=p)                     {                         q=q->next;                         }                         s->next=q->next;                         q->next=s;                         p=s;                         L.len++;                         return true;                         }                 Status Insafter(linklist &L,link &p,link s)                 {                        s->next=p->next;                        p->next=s;                        if(p==L.tail)                        {                                     L.tail=s;                                     }                        p=s;                        L.len++;                        return true;                        }                 Status Setcurelem(link &p,ElemType e)                 {                   p->data=e;                   return true;                   }                   ElemType Getcurelem(link p)                   {                            return p->data;                            return true;                            }                   Status Listempty(linklist L)                   {                          if(L.head->next==NULL)                          {                                                return true;                                                }                                                else                                                {                                                    return false;                                                    }                                                    }                  int Listlength(linklist &L)                  {                    return L.len;                    }                  Position Gethead(linklist L)                  {                    return L.head;                    }                    Position Getlast(linklist L)                    {                             return L.tail;                             }                   Position priorpos(linklist L,link p)                   {                            link pre=L.head;                            while(pre->next!=p)                            {                                   pre=pre->next;                                   }                            if(L.head==pre)                            {                               return NULL;                               }                               return pre;                               }                   Position Nextpos(linklist L,link p)                   {                         /*                           if(L.tail==p)                           {                                       return NULL;                                       }*/                                       return p->next;                                       }                  Status Locatepos(linklist L,int i,link &p)                  {                         if(i<0||i>L.len)                         {                                         return false;                                         }                       p=L.head;                       while(i!=0)                       {                                  i--;                                  p=p->next;                                  }                                                                    return 1;                                  }                     int compare(ElemType e1,ElemType e2)                     {                         if(e1>e2)                         {                                  return 1;                                  }                                  if(e1==e2)                                  {                                            return 0;                                            }                                            else                                            {                                                return -1;                                                }                                                }                                                    Position Locateelem(linklist L,ElemType e,Status compare(ElemType,ElemType))                  {                           int j;                           link p;                           p=L.head->next;                           for(int i=0;i<L.len;i++)                           {                                   if(compare(e,p->data)==0)                                   {                                       return p;                                       }                                       p=p->next;                                       }                                       return NULL;                                       }                                       Status visit(link p)                                       {                                            printf("%d",p->data);                                            }                 Status Listtraverse(linklist &L,Status visit(link p))                 {                     link p=L.head->next;                     while(p!=NULL)                     {                                         visit(p);                                         p=p->next;                                         }                                         return true;                                         }                 Status Listinsert(linklist &L,int i,ElemType e)                 {                        link h,s;                        if(!Locatepos(L,i-1,h))                        {                                               return false;                                               }                        if(!Makenode(s,e))                        {                           return false;                           }                        if(h==L.tail){L.tail=s;}                        Insfirst(L,h,s);                        return true;                        }                                          void mergelist(linklist &La,linklist &Lb,linklist &Lc)                  {                         link pa,pb,pc;                               pa=La.head->next;     pb=Lb.head->next;     Lc.head=pc=La.head;     while(pa && pb)     {                  if(pa->data <= pb->data)                  {                    pc->next=pa;                    pc=pa;                    pa=pa->next;                    }                    else                    {                        pc->next=pb;                        pc=pb;                        pb=pb->next;                        }                        }                        if(pa==NULL)                      {                         pc->next=pb;                       }                        else                         {                        pc->next=pa;                           }                                                }                                                                                                                                                                               
#include<stdio.h>#include<stdlib.h>int main(){    linklist La;Initlist(La);Listinsert(La,1,7);Listinsert(La, 2, 5);Listinsert(La, 3, 2);Listinsert(La, 4, 1);linklist lb;    Initlist(lb);Listinsert(lb,1,39);Listinsert(lb,2,19);Listinsert(lb,3,9);Listinsert(lb,4,3);/*link h,q,k; Delfirst(La,h,q); Remove(La,k);*/linklist lc;mergelist(La,lb,lc);Listtraverse(lc,visit);printf("\n");system("pause");}


0 0