折半查找和线性表的插入与删除实验

学号                     姓名                   博客名

2103101018         罗玛                   桃花岛-戌时    

题目:折半查找法

实验算法描述:

用Low、High和Mid表示待查找区间的下界、上界和中间位置指针,初值为Low=1,High=n。

(1)取中间位置Mid:Mid-(Low+High)y/2J;

(2)比较中间位置记录的关键字与给定的K值:

①相等:查找成功;

②大于:待查记录在区间的前半段,修改上界指针:High=Mid-1,转(1);

③小于:待查记录在区间的后半段,修改下界指针:Low=Mid+1,转(1);

直到越界(Low>High),查找失败 。

代码:

#include<stdio.h>
int search(int A[],int n,int key)
{
 	int low=0,high=n-1,mid;
 	if(A[low]==key)
  		return low;
 	else if(A[high]==key)
  		return high;
 	else
 	{
  		while(low<=high)
  		{
   			mid=(low+high)/2;
   			if(A[mid]==key)
    				return mid;	
   			if(key>A[mid])
    				low=mid+1;	
   			else
    				high=mid-1;	
  		}
 	}
 	return -1;	
}
main()
{
 	int A[10]={2,3,5,7,9,11,12,15,19,22},i,n,addr;
 	printf("A[10]:");
 	for(i=0;i<10;i++)
  		printf("%d ",A[i]);	
 	printf("\n输入要查找元素:");
 	scanf("%d",&n);		
 	addr=search(A,10,n);		
 	if(addr!=-1)		
  		printf("%d是数组中的第%d个元素",n,addr+1);
 	else		
  		printf("A数组中无%d",n);
 	return 0;
}

 结果:

 

题目:线性表的插入与删除

实验算法描述 :​ 

插入元素操作:

如果插入的位置不合理,抛出异常​。

如果线性表的长度大于数组的长度,抛出异常或者动态增加容量。

从最后一个元素向前遍历到第i个位置,分别将它们后移一个位置。

把元素插入第i个位置。

表长+1。

删除元素操作:

​如果删除位置不正确,抛出异常。

取出删除元素。

如果删除的不是最后一个位置从删除元素位置起向后遍历到最后一个元素位置,将它们往前移动一个位置。

表长-1。

代码:

#include <stdio.h>
#include <stdlib.h>
 
#define LIST_INIT_SIZE 5 
#define LISTINCREMENT 5  
 
#define OK 1
#define ERROR 0
 

typedef struct SqList
{
    int *elem;
    int len;
    int size;
};
 

int InitList_Sq(struct SqList *L)
{
    
    L->elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
    if (!L->elem)
        exit(0);
    L->len = 0;
    L->size = LIST_INIT_SIZE;
    return OK;
}
 

int ListInsert_Sq(struct SqList *L, int i, int e)
{
    if (i < 1 || i > L->len + 1)
        return ERROR;
    if (L->len >= L->size)
    {
        
        int *newbase = (int *)realloc(L->elem, (LIST_INIT_SIZE + LISTINCREMENT) * sizeof(int));
        
        if (!newbase)
            exit(0);
        L->size += LISTINCREMENT;
    }
    int *q = &(L->elem[i - 1]);
    int *p;
    for (p = &L->elem[L->len - 1]; p >= q; --p)
        *(p + 1) = *p;
    *q = e;
    ++L->len;
    return OK;
}
 

int ListDelete_Sq(struct SqList *L, int i, int *e)
{
    if (i < 1 || i > L->len)
        return ERROR;
    int *p = &(L->elem[i - 1]);
    *e = *p;
    int q = *L->elem + L->len - 1;
    for (++p; *p <= q; ++p)
        *(p - 1) = *p;
    L->len--;
    return OK;
}
 

void ListShow_Sq(struct SqList *L, char *s)
{
    printf("%s", s);
    int i;
    for (i = 0; i < L->len; i++)
    {
        printf("%d ", L->elem[i]);
    }
    putchar('\n');
}
 
void main()
{
    int i;
    struct SqList L;
 
    
    InitList_Sq(&L);
 
    
    int n;
    printf("预先输入的原始数据个数是:");
    scanf("%d", &n);
    printf("请线性表中%d个原始数据:", n);
    for (i = 0; i < n; i++)
    {
        int t;
        scanf("%d", &t);
        ListInsert_Sq(&L, L.len + 1, t);
    }
    ListShow_Sq(&L, "原始数据:");
 
    
    int s, v;
 
    
    printf("请输入数据插入的位置s 和数值v :");
    scanf("%d%d", &s, &v);
    printf("%s", ListInsert_Sq(&L, s, v) ? "插入成功.\n" : "插入失败.\n");
    ListShow_Sq(&L, "插入后:");
 
    
    printf("请输入数据删除的位置s :");
    scanf("%d", &s);
    if (ListDelete_Sq(&L, s, &v))
        printf("删除成功.删除的数据是:%d\n", v);
    else
        printf("删除失败.位置有误.");
    ListShow_Sq(&L, "删除后:");
 
    system("pause");
}

结果:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值