实验目的:
理解线性表的基本原理;
能够运用高级程序设计技术实现线性表及其关键算法
能够运用集成开发环境编写和调试C语言程序;
实验要求:
根据实验任务和内容编写C语言程序,编写程序要规范、正确;
解决C语言程序调试的过程中的问题,不断积累编程及调试经验;
运行所编写的代码,记录实验结果,完成实验任务;
实验内容:
1.实现顺序表基本操作集合,包括但不限于:
a)包括创建并返回一个空的线性表
b)在线性表中查找给定元素的位序
c)在线性表中指定位序插入给定元素
d)删除线性表中指定位序的元素;
2.实现顺序表的创建和就地逆置操作;
3.删除线性表中所有值大于min而且小于max的所有元素;
代码实现:代码使用到了顺序表,结构体,顺序表的各种操作等等,所有代码为本人手写,切勿用于非法用途,仅供参考学习
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define MAX_SIZE 1005 //定义顺序表的最大数组空间
typedef struct list{
int data[MAX_SIZE];
int point; //指向顺序表当前所有元素所占最大空间信息
}List;
//所有用到的函数
/*
标记
*/
void Init(List *L);
void find_data(int e,List *L);
void insert_data(int e,int site,List *L);
void print_data(List *L);
void Init_srand(List *L,int n);
void delete_data(int site,List *L);
void delete_M_data(int min,int max,List *L);
void Init(List *L)
{
(L)->point=0; //初始化的时候指向0,表示没有任何元素,从1开始计数
memset(L->data,0,sizeof(L->data)); //将所有元素进行初始化
}
void find_data(int e,List *L) //寻找特定元素
{
if(L->point==0)
{
printf("当前没有任何元素\n");
return;
}
int i=1;
while(i<=L->point&&L->data[i]!=e)
{
i++;
}
if(L->data[i]==e)
{
printf("该元素已经超过找到,并且在%d的位置上(如果有一样的元素按照先后顺序排列).\n",i);
}else{
printf("抱歉,顺序表里面没有该元素.\n");
}
}
void insert_data(int e,int site,List *L)
{
if((L)->point+1>=MAX_SIZE)
{
printf("当前容量不足,无法插入!!!\n");
return;
}
if(site>=MAX_SIZE)
{
printf("插入位置大于%d,无法插入!!!\n",MAX_SIZE);
return;
}
if(site>L->point)
{
printf("由于插入位置大于了当前的元素整体数量,所有插在了顺序表的最后面!\n");
(L)->data[L->point+1]=e;
(L)->point++;
return;
}
for(int i=(L)->point;i>=site;i--)
{
(L)->data[i+1]=(L)->data[i];
}
(L)->data[site]=e;
(L)->point++;
}
void print_data(List *L)
{
if(L->point==0)
{
printf("该顺序表没有元素!\n");
return;
}
printf("共%d个元素:\n",L->point);
for(int i=1;i<=L->point;i++) //从1开始进行数据读取
{
printf("%d ",L->data[i]);
}
printf("\n");
}
void Init_srand(List *L,int n)
{
srand((unsigned)time(NULL)); //用随机数进行初始化
for(int i=1;i<=n;i++)
{
L->data[i]=rand()%100+1;
}
L->point=n;
printf("随机数初始化完成(当前容量为%d)!!!\n",n);
}
void delete_data(int site,List *L)
{
if(site>L->point)
{
printf("位置信息有误,无法删除!\n");
}
for(int i=site;i<L->point;i++)
{
L->data[i]=L->data[i+1];
}
L->point--;
}
void inverted_data(List *L)
{
int emp,i=L->point,j=1;
while(i>=j)
{
emp=L->data[i];
L->data[i]=L->data[j];
L->data[j]=emp;
i--;
j++;
}
printf("就地逆置操作成功!!!\n");
}
void delete_M_data(int min,int max,List *L)
{
int flag[MAX_SIZE],k=0,p=0;
for(int i=1;i<=L->point;i++)
{
if(L->data[i]<=max&&L->data[i]>=min)
{
flag[k]=i;
k++;
}
}
for(int j=0;j<k;j++)
{
flag[j]-=p;
for(int i=flag[j];i<L->point;i++)
{
L->data[i]=L->data[i+1];
}
L->point--;
p++;
}
printf("min-max元素删除成功!!!\n");
}
int main()
{
List L;
Init(&L);
int flag,e,site;
while(true)
{
printf("输入 0.退出系统 1.随机初始化 2.查找元素 3.插入元素 4.删除元素 5.逆置操作 6.删除所有大于min小于max的数 7.查询所有元素\n");
scanf("%d",&flag);
if(flag==0)
{
printf("系统推出成功,欢迎您的下一次使用!\n");
break;
}
if(flag==1)
{
printf("请输入需要初始化数据的个数:\n");
scanf("%d",&e);
Init_srand(&L,e);
}
if(flag==2)
{
printf("请输入需要寻找的元素:\n");
scanf("%d",&e);
find_data(e,&L);
}
if(flag==3)
{
printf("请分别输入插入元素的位置和数值:\n");
scanf("%d%d",&site,&e);
insert_data(e,site,&L);
}
if(flag==4)
{
printf("请输入需要删除元素的位置:\n");
scanf("%d",&site);
delete_data(site,&L);
printf("删除成功!!\n");
}
if(flag==5)
{
inverted_data(&L);
}
if(flag==6)
{
int min,max;
printf("请分别输入min元素和max元素:\n");
scanf("%d%d",&min,&max);
delete_M_data(min,max,&L);
}
if(flag==7)
{
print_data(&L);
}
}
return 0;
}