学号 姓名 博客名
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");
}
结果: