C语言 算法与数据结构 顺序表 基本操作及实验案例

C语言 算法与数据结构 顺序表 基本操作及实验案例

实验要求:

1.(80%)完成顺序表的基本运算:初始化、显示、求长度、判空、判满、插入、删除、取元素等,并编写主函数测试算法。
2.(90%)设计算法:将一个元素插入到有序的顺序表中,使顺序表仍有序,并编写主函数测试算法。
3.(100%)设A和B两个顺序表,其元素按从小到大的顺序排列。编写一个A和B中所有元素组成一个新的从小到大的有序顺序表C的算法,并编写主函数测试算法。
提示:(1)算法:有序表合并。
(2)有序表的产生,可以人为输入,也可以调用内容2的算法实现。

//包含实验三个实验内容,part 1,2,3
#include
#include
#include	//采用非阻塞式输入,方便选项跳转
#include	//用于产生随机数模拟有序数列

#define MAXSIZE 1000	//设置最大数列大小

typedef int elemtype;	//定义元素类型

typedef struct	//定义结构体数列
{
	elemtype data[MAXSIZE];
	int last;
} datalist;
//函数声明区
//-----------------------------------------------------------------------
//第一部分
int part1(void);
//选择菜单
char choiceitem();
//初始化数列
datalist * defaultlist(void);
//追加元素到列表
int addinfo(datalist * pl,int times);
//从列表删除元素
int deleteinfo(datalist * pl,int space);
//检查列表是否为空,空返回1否则0
int ifempty(datalist * pl);
//检查列表是否已满,满返回1否则0
int iffull(datalist * pl);
//改变元素的值
int changeinfo(datalist * pl,int space,int change);
//输出列表
void outputlist(datalist * pl);
//返回列表长度
int lenthlist(datalist * pl);
//插入元素到列表
int insertinfo(datalist * pl,int space,int num);
//清空列表
void deletelist(datalist * pl);
//-----------------------------------------------------------------------
//第二部分
int part2(void);
//产生一个随机有序数列
void rulenummade(datalist * pl);
//计算插入值应该插入的位置
int findspace(datalist * pl,int num);
//-----------------------------------------------------------------------
//第三部分
int part3(void);
//顺序表合并到新表
datalist * doublerulelistcontact(datalist * pc,datalist * pa,datalist * pb);

int main(void)
{
	system("color f0");
	system("title Main 功能选择 dev: Ice2Faith");
    char sel;
	do	//直到用户需要退出程序退出循环结束程序
	{
		printf("\twelcome here\n\n");
		printf("\t算法与数据结构 顺序表\n\n");//功能提示输出和获取进去功能版块
        printf("---------------------------------\n");
		printf("请选择功能:\n");
		printf("\t1.第一部分\n");
		printf("\t2.第二部分\n");
		printf("\t3.第三部分\n");
		printf("\t0.退出程序\n/> ");
		do	//直到获取到正确的选项值退出循环
		sel=getch();
		while(sel<'0'||sel>'3');
		system("cls");	//清屏进入功能版块
		switch(sel)
		{
			case '1':
				part1();
				break;
			case '2':
				part2();
				break;
			case '3':
				part3();
				break;
			case '0':
				break;
		}
	}while(sel!='0');


	return 0;
}

//第一部分
int part1(void)
{
	system("title Part 1 常规顺序表操作 dev: Ice2Faith");
	datalist * pl=defaultlist();	//初始化数列
	char chioce;
	do	//直到用户需要退出该循环为止退出循环
    {
        chioce=choiceitem();	//调用选择方法获得选择项的值
        switch(chioce)	//进入选择项跳转
        {
        case '1':
            outputlist(pl);	//输出数列
            break;
        case '2':
            {
                int times;	//追加数列
                fflush(stdin);
                printf("请问您需要添加几个元素:\n/> ");
                scanf("%d",&times);
                printf("请输入 %d 个元素:\n/> ",times);
                if(addinfo(pl,times)==-1)
					printf("操作失败,元素个数将会超出\n\n");
                break;
            }

        case '3':
            {
                int space;	//删除元素
                fflush(stdin);
                printf("您想删除第几个元素:\n/> ");
                scanf("%d",&space);
                if(deleteinfo(pl,space)==-1)
					printf("操作失败,该位置不合法\n\n");
                break;
            }

        case '4':
            {
                int space1,change;	//改变元素的值
                fflush(stdin);
                printf("您要改变第几个元素:\n/> ");
                scanf("%d",&space1);
                fflush(stdin);
                printf("要将它改变为多少:\n/> ");
                scanf("%d",&change);
                if(changeinfo(pl,space1,change)==-1)
					printf("操作失败,该位置不合法\n\n");
                break;
            }
        case '5':
            {
                int space2,num;	//插入元素
                fflush(stdin);
                printf("您想插入到第几个位置:\n/> ");
                scanf("%d",&space2);
                fflush(stdin);
                printf("请输入您要插入的值:\n/> ");
                scanf("%d",&num);
                if(insertinfo(pl,space2,num)==-1)
					printf("操作失败,该位置不合法\n\n");
                break;
            }
        case '6':
            deletelist(pl);	//清空数列
            break;
        case '7':
            system("cls");	//清屏
            break;
        case '8':
            system("mode con cols=55 lines=40");	//设置合适窗口大小
            break;
        }
        if(chioce=='0')	//退出版块提示
            printf("您这样做将会失去我!\n");
        if(chioce!='7'&&chioce!='8')	//控制下一选项前的暂停
        {
            printf("\n");
            system("pause");
        }
    }while(chioce!='0');
    free(pl);	//释放pl空间
    system("cls");
	return 0;
}

//选择菜单
char choiceitem()
{
	char choice;
	printf("\twelcome here\n\n");	//输出选择项和说明
	printf("请选择:\n\n");
	printf("---------------------------------\n");
	printf("\t1.查看顺序表\n");
	printf("\t2.添加元素\n");
	printf("\t3.删除元素\n");
	printf("\t4.改变元素\n");
	printf("\t5.插入元素\n");
	printf("\t6.清空顺序表\n");
	printf("\t7.清屏\n");
	printf("\t8.调整窗口到建议大小\n");
	printf("\t0.退出本部分\n\n");
	printf("---------------------------------\n/> ");
	do	//获取选择项,直到选择项合法为止并输出选择项
	{
	   choice=getch();
	}
	while(choice<'0'||choice>'8');
	printf("%c\n",choice);
	return choice;
}

//初始化数列
datalist * defaultlist(void)
{
	datalist * pl;
	pl=(datalist *)malloc(sizeof(datalist));	//申请并初始化一个datalist型空间且返回空间地址
	pl->last=0;
	return pl;
}

//追加元素到列表
int addinfo(datalist * pl,int times)
{
	//check whether more than maxsize
	if(pl->last+times>MAXSIZE-1)	//检测追加元素会不会溢出,不会则进行添加操作,长度增加
		return -1;
	for(int i=0;i<times;i++)
	{
		scanf("%d",&(pl->data[pl->last+i]));
	}
	pl->last+=times;
	return 1;
}

//从列表删除元素
int deleteinfo(datalist * pl,int space)
{
	space-=1;
	if(space<0 ||space>=pl->last)	//检查删除元素是否合法,合法则进行移位覆盖删除,长度-1
		return -1;
	for(int i=space;i<=pl->last;i++)
		pl->data[i]=pl->data[i+1];
	pl->last--;
	return 1;
}

//检查列表是否为空,空返回1否则0
int ifempty(datalist * pl)
{
	return pl->last==0?1:0;	//检查数列是否为空,空则返回1否则返回0
}

//检查列表是否已满,满返回1否则0
int iffull(datalist * pl)
{
	return pl->last==MAXSIZE-1?1:0;	//检查数列是否已满,满则返回1否则返回0
}

//改变元素的值
int changeinfo(datalist * pl,int space,int change)
{
	space-=1;
	if(space<0 ||space>pl->last-1)	//如果改变值部分合法则进行修改
		return -1;
	pl->data[space]=change;
	return 1;
}

//输出列表
void outputlist(datalist * pl)
{
    printf(">>> \t");
	if(pl->last==0)	//判断长度是否为空,并提示
		printf("此处为空,请添加!!");
	for(int i=0;i<pl->last;i++)	//格式化输出数列并换行
		printf("[%d]\t",pl->data[i]);
	printf("\n");
}

//返回列表长度
int lenthlist(datalist * pl)
{
	return pl->last;	//返回数列长度
}

//插入元素到列表
int insertinfo(datalist * pl,int space,int num)
{
	space-=1;
	if(space<0 ||space>pl->last)	//检查插入位置是否合法
		return -1;
	for(int i=pl->last;i>space;i--)	//将插入位置以后的数列向后移动一位
		pl->data[i]=pl->data[i-1];
    pl->data[space]=num;	//插入需要插入的值,数列长度+1
	pl->last++;
	return 1;
}

//清空列表
void deletelist(datalist * pl)
{
    pl->last=0;	//重置数列长度
}

//-----------------------------------------------------------------------
//第二部分
int part2(void)
{
    system("title Part 2 插入元素到有序顺序表 dev: Ice2Faith");
	datalist * pl;	//为pl数列申请空间做初始化
	pl=defaultlist();
	char con='c';
    rulenummade(pl);	//调用方法得到一个有序数列
	do	//直到用户需要退出(输入q)该部分
    {
        printf("已为您准备好一切,开始:\n\n");
        printf("---------------------------------\n");
        printf("这是您的默认有序列表\n\n");	//输出初始有序数列
        outputlist(pl);
        printf("---------------------------------\n");
        printf("请输入需要插入的值:\n/> ");	//获得用户需要插入的值并进行调用方法插入
        int num;
        fflush(stdin);
        scanf("%d",&num);
        insertinfo(pl,findspace(pl,num),num);
        printf("这是您插入值之后的结果\n\n");
        outputlist(pl);
        printf("---------------------------------\n");
        printf("如果您想退出第二部分, 请输入 \'Q\',否则继续:\n/> ");	//获得用户是否需要退出该部分
        fflush(stdin);
        con=getch();
        if(con!='Q'||con!='q')
            system("cls");
    }while(con!='Q'&&con!='q');
    free(pl);
    return 0;
}
//产生一个随机有序数列
void rulenummade(datalist * pl)
{
	srand((unsigned)time+rand());
	int lenth=rand()%300+10;	//决定所产生的随机有序数列的元素个数
	int before=rand()%20+1;		//决定初始随机数大小及后面进行迭代存储
	for(int i=0;i<=lenth;i++)	//循环lenth次,传入一个有序数列,每个元素在之前元素基础上随机加一个整数
	{
		srand((unsigned)time+rand());
		pl->data[i]=before;
		before+=rand()%8;
	}
	pl->last=lenth+1;	//记录数列长度
}
//计算插入值应该插入的位置
int findspace(datalist * pl,int num)
{
    int i=0;	//遍历找到应该插入的位置
    while(num>pl->data[i]&&i<pl->last)
        i++;
    return i>pl->last?pl->last:++i;	//如果遍历结束还没有找到位置,则应插入到最后位置,否则返回找到的位置
}

//-----------------------------------------------------------------------
//第三部分
int part3(void)
{
    system("title Part 3 两个有序数列的整合合并 dev: Ice2Faith");
	datalist * pl;	//申请并初始化两个数列pl,pk
	pl=defaultlist();
	datalist * pk;
	pk=defaultlist();
	datalist * pc;
	pc=defaultlist();
	char con='c';
	do 		//用户不退出则继续循环
    {
       	rulenummade(pl); 	//调用方法产生两个随机有序数列
        rulenummade(pk);
        printf("已为您准备好一切,开始:\n\n");
        printf("---------------------------------\n");
        printf("您的默认有序数列:\n\n");	//输出初始的随机有序数列
        outputlist(pl);
        printf("---------------------------------\n");
        outputlist(pk);
        printf("---------------------------------\n");
        printf("请继续,即将开始合并:\n");
        system("pause");
        printf("合并之后的有序数列:\n\n");	//输出合并后的有序数列一pl
        outputlist(doublerulelistcontact(pc,pl,pk));    //调用合并方法合并数列到pc返回给输出函数输出结果
        printf("---------------------------------\n");
        printf("如果您想退出第三部分, 请输入 \'Q\',否则继续:\n/> ");	//提示用户选择是否退出第三部分,输入‘q'退出
        fflush(stdin);
        con=getch();
        if(con!='Q'||con!='q')
            system("cls");
    }while(con!='Q'&&con!='q');
    free(pl);	//释放pl,pk的空间
    free(pk);
    free(pc);
    return 0;
}

//顺序表合并到新表
datalist * doublerulelistcontact(datalist * pc,datalist * pa,datalist * pb)
{
	int i,j,k;
	i=0;
	j=0;
	k=0;
	while(pa->last>i && pb->last>j) //循环到两数列其中一个结束并排序到存储数列中
	{
		if(pa->data[i]<pb->data[j])
			pc->data[k++]=pa->data[i++];
		else
			pc->data[k++]=pb->data[j++];
	}
	while(pa->last>i)   //两个循环将剩下一个未结束的数列复制到存储数列中
		pc->data[k++]=pa->data[i++];
	while(pb->last>j)
		pc->data[k++]=pb->data[j++];
	pc->last=pa->last+pb->last; //更改存储数列的长度
	return pc;  //返回结果数列
}

你可能感兴趣的:(C语言,算法与数据结构,C语言,算法与数据结构,顺序表,array)