线性表顺序存储实验2 使用随机函数,生成包含20个介于60-99直接的整数值,存入顺序存储线性表,然后调用相应删除算法,删掉线性表中最大的数(如果有多个相同的最大数,删除第一个即可),然后输出线性表剩余值。
COMMON.H
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h> //用于设置随机数种子用
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
SEQLIST.H
#include"common.h"
/*
*头文件中最好只包含全局变量的声明,函数声明,宏定义等代码,
*不建议包括函数的完整实习代码,以免报重复引用错误。
*函数代码实现部分在seqlist.c中完成
*/
#define ElemType int
#define MAXSIZE 100 /此处的宏定义常量表示线性表可能达到的最大长度/
typedef struct
{
ElemType elem[MAXSIZE]; /线性表占用的数组空间/
int last; /记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1/
} SeqList;
//函数功能:顺序表中查找值为e的元素位置
//输入参数L:顺序表
//输入参数e:要查找的元素
//返回值:若找到则返回顺序表中的位置(下标+1),否则返回-1
int Locate(SeqList L,ElemType e);
//函数功能:在顺序表指定位置插入值e
int InsList(SeqList *L, int i,ElemType e);
/在顺序表L中删除第i个数据元素,并用指针参数e返回其值/
//函数功能:删除顺序表中的指定位置i上的元素
int DelList(SeqList *L,int i,ElemType *e) ;
//函数功能:输出顺序表的值
void SeqPrint(SeqList *L);
//函数功能:LA与LB表合并算法
void Merge(SeqList *LA, SeqList *LB, SeqList *LC);
SEQLIST.C
#include"seqlist.h"
//函数功能:顺序表中查找值为e的元素位置
//输入参数L:顺序表
//输入参数e:要查找的元素
//返回值:若找到则返回顺序表中的位置(下标+1),否则返回-1
int Locate(SeqList L,ElemType e)
{
int i=0; /i为扫描计数器,初值为0,即从第一个元素开始比较/
while((i<=L.last)&&(L.elem[i]!=e)) /顺序扫描表,直到找到值为e的元素, 或扫描到表尾而没找到/
i++;
if(i<=L.last)
return(i+1); /若找到值为e的元素,则返回其序号/
else
return(-1); /若没找到,则返回空序号/
}
//函数功能:在顺序表指定位置插入值e
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++; //尾指示器增加1
return(OK);
}
/在顺序表L中删除第i个数据元素,并用指针参数e返回其值/
//函数功能:删除顺序表中的指定位置i上的元素
int DelList(SeqList *L,int i,ElemType *e)
{
int k;
if((i<1)||(i>L->last+1))
{
printf(“删除位置不合法!”);
return(ERROR);
}
*e= L->elem[i-1]; //将删除的元素存放到e所指向的变量中
for(k=i;k<=L->last;k++) //此句教材代码有误
L->elem[k-1]= L->elem[k]; //将后面的元素依次前移
L->last–; //尾指示器-1
return(OK);
}
//函数功能:输出顺序表的值
void SeqPrint(SeqList *L)
{
printf(“当前线性表中数据为:\n”);
int i;
for(i=0;i<=L->last;i++)
printf("%d “,L->elem[i]);
printf(”\n");
}
//函数功能:LA与LB表合并算法
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]) //如果 LA(i)的当前元素值小,则LA(i)放入LC中
{
LC->elem[k]= LA->elem[i];
i++; }
else //否则LB(j)放入LC中
{
LC->elem[k]=LB->elem[j];
j++;
}
k++;
}
while(i <= LA->last) //将表LA余下的元素赋给表LC
{
LC->elem[k] = LA->elem[i];
i++; k++;
}
while(j <= LB->last) //将表LB余下的元素赋给表LC
{
LC->elem[k]= LB->elem[j];
j++; k++;
}
LC->last=LA->last+LB->last+1; //LC的尾指示器赋值
}
MAIN.C
#include"seqlist.h"
/*
使用随机函数,生成包含20个介于60-99直接的整数值,存入顺序存储线性表,
然后调用相应删除算法,删掉线性表中最大的数(如果有多个相同的最大数,
删除第一个即可),然后输出线性表剩余值。
*/
int main()
{
//创建顺序表并录入值
SeqList L;
int i,p;
int max=0,m; //max 存放最大值下标
L.last=19; //线性表的长度已知:20
srand((int)time(0)); //设置随机数种子,避免每次生成的随机数都一样
for(i=0;i<=L.last;i++)
{
L.elem[i]=rand()%40+60; //生成60-99以内的整数
// if(L.elem[max]<L.elem[i]) //找出最大值下标
// max=i;
}
//输出当前线性表内容
SeqPrint(&L);
//找出最大值对应下标,这一步也可以在上面的循环中完成
for(i=0;i<=L.last;i++)
{
if(L.elem[max]<L.elem[i])
max=i;
}
//删除操作
printf("要删除的最大值位置:%d\n",max+1);
if(DelList(&L,max+1,&m)==1) //调用删除算法,根据返回值判断是否删除成功,&m用于传出删除的值
{
printf("最大值%d已被删除。\n",m);
SeqPrint(&L);
}
else
printf("删除失败。\n");
//system("pause"); //防止运行结果窗口自动关闭
return 0;
}