用C语言实现顺序表的所有基本操作,另加折半查找等等,内含详细注释

不说多的,直接上代码。。。

我已经把所有的操作实现,你可以在main()中自己选择要进行的操作。

#include "stdio.h"
#include "windows.h"
#include "stdlib.h"

#define Maxsize 30 //顺序表最大的长度

//定义顺序表
typedef struct{
    int data[Maxsize];
    int length;
}SqList;


//初始化顺序表
 void InitList(SqList *L){
     L->length=0;
 }

 //创建顺序表
 int CreateList(SqList *L,int a[], int n){
     int i;
     for (i=0;i<n;i++){
        L->data[i]=a[i];
     }
     L->length = n;
     return 1;
 }
 //输出顺序表
 void Printf_all(SqList L){
     int i;
     for(i=0;i<L.length;i++){
        printf("%d ",L.data[i]);
     }
     printf("\n");
 }
 //从键盘读取值到数组
// void input(int a[],int n){
//     int i=0;
//     for(i;i<n;i++){
//        scanf("%d ",&a[i]);
//     }
// }
 //按顺序插入
 int ListInsert(SqList *L,int n,int e){
     if(n<0||n>L->length){
        printf("you input unlawfal\n");
        return 0;
     }
     if(L->length==Maxsize){
        printf("this sequence is full\n");
        return 0;
    }
    else{
    int i=L->length;
    for(i;i>=n-1;i--){
        L->data[i]=L->data[i-1];
    }
    L->data[n-1]=e;
    L->length++;
    return 1;
    }
 }
 //按值查找
 int Select(SqList L,int e){
     int i;
     for(i=0;i<L.length;i++){
        if(L.data[i]==e){
           break;
        }
     }
     return i+1;
 }

 //折半查找
 int SearchExchangeInsert(SqList L,int x){
     int low =0;
     int hight = L.length-1;
     int mid ;
     while(low<hight){
        mid = (low+hight)/2;
        if(L.data[mid]==x){
            return mid+1;
        }else if(L.data[mid]<x){
            low=mid+1;
        }else{
            hight=mid-1;
        }
     }
     if(low>hight){
         return 0;
     }
 }



 //删除指定位置的值
 int delete(SqList *L,int i){
     for(i;i<L->length;i++){
        L->data[i-1]=L->data[i];
     }
 }

 //有序线性表删除指定范围的值(s<t)
 int delete_ranke(int s ,int t,SqList *L){
     int i=0;
     int j=0;
     if(s>=t||L->length==0){
        return 0;
     }
        /*** 寻找第一个大于s的数***/
     for(i=0;i<L->length&&L->data[i]<s;i++){
        ;
     }
     if(i>=L->length){
        return 0;
     }
     /******寻找第一个小于t的数*****/
     for(j=i;L->data[j]<=t&&j<L->length;j++){
        ;
     }
     /*******进行删除******/
     for(j;j<L->length;i++,j++){
        L->data[i]=L->data[j];
     }
     L->length=i;
     return 1;
 }
 /*******修改值********/
 void ChangeByValue(SqList *L,int i,int e){
    if(i<0||i>L->length){
        printf("your range is illegal");
    }else{
        L->data[i-1]=e;
    }
 }


 int main(){
     SqList L;
     InitList(&L);
     int a[10]={6,7,8,9,10,11,12,13,15,16};

     CreateList(&L,a,10);
     printf("创建完成,输出所有的值为\n");
     Printf_all(L);

     //在第t个位置插入100
//     int t=6;
//     if(ListInsert(&L,t,100)==0){
//        ;
//     }else{
//     int t=6;
//     ListInsert(&L,t,100);
//     printf("在第");
//     printf("%d",t);
//     printf("个位置插入100:\n");
//     Printf_all(L);
//     }

     //按值查找8
    // printf("the numble 8 located in %d",Select(L,8));

    //折半查找x
    printf("X的位置是: %d\n",SearchExchangeInsert(L,8));

    //删除一定范围的值
    delete_ranke(5,9,&L);
    Printf_all(L);
    //printf("%d\n",L.length);

    //修改值
    ChangeByValue(&L,1,9);
    Printf_all(L);
 }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强大的RGG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值