顺序表基本操作

 #include <stdlib.h>

 #define maxsize 20000
 

typedef int element;
 typedef struct
 {
     element *elem;
     int length;
     int listsize;
 }SqList;
 int initList(SqList * L)//结构初始化
 {
     L->elem = new element[maxsize];//(L->elem等价于L.elem)为顺序表分配大小为maxsize的数组空间
     if(!L->elem) return -1;//此处也可以用exit(-1)结束程序
     L->length = 0;
     L->listsize = maxsize;
     return 0;
 }
 void creat(SqList * L, int n)//填充数组
 {
     int i;
     for(i=0; i<n; i++)
         scanf("%d", &L->elem[i]);
     L->length = n;
 }
 
 int Delete(SqList * L, int k)//删除
 {
     element *p, *q;
     if(k<0||k>L->length-1)
   return 0;
     q=L->elem + L->length;//数组开始元素的位置加上数组的长度即为末位置
     for(p=&(L->elem[k]); p<q; p++)//元素左移
         *p=*(p+1);
     L->length--;//表的长度减 1
     return 1;
 }
 
 void locList(SqList * L)//查找
 {
     element *p, *q;
     for(p=L->elem; p<L->elem + L->length; p++)
         for(q=p+1; q<L->elem + L->length; q++)
        {
             if(*p==*q)
             {
                 Delete(L, (q-L->elem));//q-L->elem为查找的重复元素的位序 k
                            //q->elem为数组开头元素的位置

                 q--
;//向前移动保证始终指向末位置
             }

       }
 }

 


 

void Buildlist(SqList * L, int n)//建表算法
 {
     L->length = 1;
     element *p, *q;
     for(q=L->elem+1; q<L->elem + n; q++)
     {
       int flag=1;
       for(p=L->elem; p<L->elem + L->length; p++)

       {
             if(*p==*q)
             {
                 flag=0;
                 break;
             }

       }
        if(flag==1)
        {
            L->elem[L->length]=*q;
            L->length++;
        }
     }

}

 
 int purge(SqList &La, SqList &Lb, SqList &Lc) //归并
 {
     if(La.length+Lb.length>Lc.listsize)
         return 0;
     element *p, *q;
     int i=0, j=0, k=0;
     while(i<La.length&&j<Lb.length)
     {
         if(La.elem[i]<Lb.elem[j])
         {
             Lc.elem[Lc.length++]=La.elem[i];
             i++;

        }
        else
         {
             Lc.elem[Lc.length++]=Lb.elem[j];
             j++;

        }

    }
     while(i<La.length)
     {
         Lc.elem[Lc.length++]=La.elem[i];
         i++;

    }
     while(j<Lb.length)
     {
         Lc.elem[Lc.length++]=Lb.elem[j];
         j++;

    }

}

 

 

void Swap(SqList * L, int n, int m)
{
    int t, i, j=0;
    element *p, *q;
    for(i=0; i<L->length/2; i++)//第一次交换
    {
      t=L->elem[i];
      L->elem[i] = L->elem[n-i-1];
      L->elem[n-i-1]=t;
    }

    for(i=0; i<(n-m)/2; i++)//第二次交换
    {
       t=L->elem[i];
       L->elem[i] = L->elem[n-m-i-1];
       L->elem[n-m-i-1]=t;
    }

    for(i=n-m; j<m/2; i++)//第三次交换
    {
        t=L->elem[i];
        L->elem[i]=L->elem[2*n-m-i-1];
        L->elem[2*n-m-i-1]=t;
        j++;
    }

}

 

int binsearch(SqList * L, int s, int t, int m)//二分查找
 {
     int low=s, high=t, mid;
     if(s<=t)
     {
         mid=low+(high-low)/2;
         if(L->elem[mid]==m)
         {
             printf("%d\n", mid+1);
             return 0;
         }
         if(L->elem[mid]>m)
             return binsearch(L, low, mid-1, m);
         else
             return binsearch(L, mid+1, high, m);
     }
     printf("No Found!\n");
 }

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值