整理--数据结构--线性表

    技术2022-05-11  148

                                      顺序表:

    //查找运算

    int  Locate(SeqList L, ElemType e)

    {     int i=0;       // i为扫描计数器,初值为0,即从第一个元素开始比较

           while ((i<=L.last)&&(L.elem[i]!=e))

                        //顺序扫描表,直到找到值为key的元素, 或扫描到表尾而没找到

                        i++;

              if  (i<=L.last)

                        return(i+1);  //若找到值为e的元素,则返回其序号

              else

                        return(-1);  //若没找到,则返回空序号    }

    //插入运算

    /*在顺序表L中第i个数据元素之前插入一个元素e。 插入前表长n=L->last+1

    i的合法取值范围是 1≤i≤L->last+2  */

    int  InsList(SeqList *L,int i,ElemType e)//插入运算

    {         int k;

              if((i<1) || (i>L->last+2)) /*首先判断插入位置是否合法*/

              {         printf("插入位置i值不合法");

                        return(ERROR);      }

              if(L->last>= MAXSIZE-1)

              {        printf("表已满无法插入");

                        return(ERROR);      }

              for(k=L->last;k>=i-1;k--)   /*为插入元素而移动位置*/

                        L->elem[k+1]=L->elem[k];

              L->elem[i-1]=e;   /*C语言数组中,第i个元素的下标为i-1*/

              L->last++;

              return(OK);         }

    //删除运算

    int  DelList(SeqList *L,int i,ElemType *e)

    /*在顺序表L中删除第i个数据元素,并用指针参数e返回其值。i的合法取值为1≤i≤L.last+1 */   

    {         int k;

              if((i<1)||(i>L->last+1))  

              {         printf("删除位置不合法!");

                        return(ERROR);      }

              *e = L->elem[i-1];  /* 将删除的元素存放到e所指向的变量中*/

              for(k=i; i<=L->last; k++)

                        L->elem[k-1] = L->elem[k];  /*将后面的元素依次前移*/

              L->last--;

              return(OK);         }

    void      merge(SeqList *LA,  SeqList *LB,  SeqList *LC)

    {         int i,j,k;

              i=0;j=0;k=0;

              while(i<=LA->last&&j<=LB->last)

                        if(LA->elem[i]<=LB->elem[j])

                        {         LC->elem[k]= LA->elem[i];

                                   i++;

                                   k++;}

                        else

                        {         LC->elem[k]=LB->elem[j];

                                   j++;

                                   k++;      }

              while(i<=LA->last)  /*当表LA有剩余元素时,则将表LA余下的元素赋给表LC*/

              {         LC->elem[k]= LA->elem[i];

                        i++;

                        k++;      }

              while(j<=LB->last)  /*当表LB有剩余元素时,则将表LB余下的元素赋给表LC*/        

              {         LC->elem[k]= LB->elem[j];

                        j++;

                        k++;      }

              LC->last=LA->last+LB->last+1;}

     

                                       单链表:

    //对单链表进行初始化

    void init_linklist(LinkList *l)

    {         *l=(LinkList)malloc(sizeof(Node)); /*申请结点空间*/

              (*l)->next=NULL;                   /*置为空表*/    }

    //头插法建立链表

    void CreateFromHead(LinkList   L)

    {         Node   *s;

              char      c;

              int       flag=1;

             while(flag)   /* flag初值为1,当输入"$"时,置flag0,建表结束*/

              {         c=getchar();  

                        if(c!='$')

                        {         s=(Node*)malloc(sizeof(Node)); /*建立新结点s*/

                                   s->data=c;

                                   s->next=L->next;/*s结点插入表头*/

                                   L->next=s;                     }

                        else

                                   flag=0;   }}

    //尾插法建立链表

    void CreateFromTail(LinkList L) {

              Node *r, *s;

              char c;

              int   flag =1; /*设置一个标志,初值为1,当输入"$"时,flag0,建表结束*/

              r=L;           /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/

              while(flag)         /*循环输入表中元素值,将建立新结点s插入表尾*/

              {         c=getchar();

                        if(c!='$')

                        {         s=(Node*)malloc(sizeof(Node));

                                   s->data=c;

                                   r->next=s;

                                   r=s;      }

                        else

                        {flag=0;

                                   r->next=NULL;   /*将最后一个结点的next链域置为空,表示链表的结束*/}   }   }

    //单链表按序号查找

    Node * Get (LinkList  L, int i)

    /*在带头结点的单链表L中查找第i个结点,若找到(1≤i≤n),则返回该结点的存储位置; 否则返回NULL*/

    {         int j;

              Node  *p;

              p=L;

              j=0;   /*从头结点开始扫描*/

              while ((p->next!=NULL)&&(j<i))

              {         p=p->next;    /* 扫描下一结点*/

                        j++;   /* 已扫描结点计数器 */            }

              if(i == j)

                        return p;   /* 找到了第i个结点 */

              else

                        return NULL;   /* 找不到,i≤0i>n */  }

    //单链表按值查找

    Node * Get (LinkList  L, int i)

    /*在带头结点的单链表L中查找第i个结点,若找到(1≤i≤n),则返回该结点的存储位置; 否则返回NULL*/

    {         int j;

              Node  *p;

              p=L;

              j=0;   /*从头结点开始扫描*/

              while ((p->next!=NULL)&&(j<i))

              {         p=p->next;    /* 扫描下一结点*/

                        j++;   /* 已扫描结点计数器 */  }

              if(i == j)

                        return p;   /* 找到了第i个结点 */

              else

                        return NULL;   /* 找不到,i≤0i>n */            }

    //求表长

    int       ListLength(LinkList L)

    /*求带头结点的单链表L的长度*/

    {         Node *p;

              int j;

              p=L->next;

              j=0;   /*用来存放单链表的长度*/

              while(p!=NULL)

              {         p=p->next;

                        j++;      }

              return j; /*j为求得的单链表长度*/       }

    //单链表的插入运算

    int InsList(LinkList L,int i,ElemType e)

    /*在带头结点的单链表L中第i个位置插入值为e的新结点s*/

    {         Node *pre,*s;

              int k;

              pre=L; 

              k=0;                     /*""开始,查找第i-1个结点*/

              while(pre!=NULL&&k<i-1)  /*表未查完且未查到第i-1个时重复,找到pre指向第i-1*/

              {         pre=pre->next;

                        k=k+1;    }                                                                                          /*查找第i-1结点*/

              if(!pre)      /*如当前位置pre为空表已找完还未数到第i个,说明插入位置不合理*/

              {         printf("插入位置不合理!");

                        return ERROR;       }

              s=(Node*)malloc(sizeof(Node));   /*申请一个新的结点S */

              s->data=e;                       /*e置入s的数据域*/

              s->next=pre->next;                                 /*修改指针,完成插入操作*/

              pre->next=s;

              return OK;                     }

    //单链表的删除运算

    int DelList(LinkList L,int i,ElemType *e)

    /*在带头结点的单链表L中删除第i个元素,并将删除的元素保存到变量*e*/

    {         Node *pre,*r;

              int k;

              pre=L;

              k=0;

              while(pre->next!=NULL && k<i-1)       /*寻找被删除结点i的前驱结点i-1使p指向它*/

              {         pre=pre->next;

                        k=k+1;    }                  

    /*查找第i-1个结点*/

              if(!(pre->next))     /* while循环是因为p->next=NULLi<1而跳出的,而是因为没有找到合法的前驱位置,说明删除位置i不合法。*/

              {         printf("删除结点的位置i不合理!");

                        return ERROR;       }

              r=pre->next;

              pre->next=pre->next->next;    /*修改指针,删除结点r*/

              *e = r->data;

              free(r);    /*释放被删除的结点所占的内存空间*/

              printf("成功删除结点!");

              return OK;          }

    //单链表有序合并

    LinkList MergeLinkList(LinkList LA, LinkList LB)

    /*将递增有序的单链表LALB合并成一个递增有序的单链表LC*/

    {         Node *pa,*pb;

              Node *r;

              LinkList LC;

    /*LC初始置空表。papb分别指向两个单链表LALB中的第一个结点,r初值为LC*/

              pa=LA->next;

              pb=LB->next;

              LC=LA;

              LC->next=NULL;

              r=LC;

    /*当两个表中均未处理完时,比较选择将较小值结点插入到新表LC中。*/

              while(pa!=NULL && pb!=NULL)

              {         if(pa->data <= pb->data)

                        {         r->next=pa;

                                   r=pa;

                                   pa=pa->next;        }

                        else

                        {         r->next=pb;

                                   r=pb;

                                   pb=pb->next;        }}

              if(pa) /*若表LA未完,将表LA中后续元素链到新表LC表尾*/

                        r->next=pa;

              else      /*否则将表LB中后续元素链到新表LC表尾*/

                        r->next=pb;

              free(LB);

              return(LC);         }

    //循环链表合并算法1

    LinkList   merge_1(LinkList LA,LinkList LB)

    {  /*此算法将两个采用头指针的循环单链表的首尾连接起来*/

              Node *p, *q;

              p=LA;

              q=LB;

              while (p->next!=LA) p=p->next;          /*找到表LA的表尾,用p指向它*/

              while (q->next!=LB) q=q->next;          /*找到表LB的表尾,用q指向它*/

              q->next=LA;         /*修改表LB 的尾指针,使之指向表LA 的头结点*/

              p->next=LB->next; /*修改表LA的尾指针,使之指向表LB 中的第一个结点*/

              free(LB);

              return(LA);         }

    //循环链表合并算法2

    LinkList  merge_2(LinkList RA,LinkList RB)

    {  /*此算法将两个采用尾指针的循环链表首尾连接起来*/

              Node *p;

              p=RA->next; /*保存链表RA的头结点地址*/

              RA->next=RB->next->next;/*链表RB的开始结点链到链表RA的终端结点之后*/

              free(RB->next);/*释放链表RB的头结点*/

              RB->next=p;/*链表RA的头结点链到链表RB的终端结点之后*/

        return  RB;/*返回新循环链表的尾指针*/          }

    //双向链表单插入运算

    int DlinkIns(DoubleList L,int i,ElemType e)

    {         DNode  *s,*p;

              int k;

              p=L; 

              k=0;                     /*""开始,查找第i-1个结点*/

              while(p->next!=L&&k<i)  /*表未查完且未查到第i-1个时重复,找到p指向第i*/

              {         p=p->next;

                        k=k+1; }                                       /*查找第i-1结点*/

              if(p->next == L)      /*如当前位置p为空表已找完还未数到第i个,说明插入位置不合*/

              {         printf("插入位置不合理!");

                        return ERROR;                  }

              s=(DNode*)malloc(sizeof(DNode));

             if (s)

              {         s->data=e;

                        s->prior=p->prior;            

                        p->prior->next=s;  

                        s->next=p;                              

                        p->prior=s;                             

                        return OK;          }

              else

                        return ERROR;       }

    //双向链表单删除运算

    int       DlinkDel(DoubleList L,int i,ElemType *e)

    {         DNode  *p;

              int k;

              p=L; 

              k=0;                     /*""开始,查找第i个结点*/

              while(p->next!=L && k<i)  /*表未查完且未查到第i个时重复,找到p指向第i*/

              {         p=p->next;

                        k=k+1;              }                                                                                

              if(p->next == L)      

              {         return ERROR;       }

              else

              {         *e=p->data;

                        p->prior->next=p->next;

                        p->next->prior=p->prior;

                        free(p);

                        return OK;}}

      


    最新回复(0)