顺序表算法应用
利用顺序表数据类型解决实际问题,内容如下:
(1) 定义顺序表结构数组对象,最多能存100个数据;
(2) 调用创建函数初始化顺序表为1,5,96,45,3,6,4,88,7,36
(3) 调用输出函数,要求输出当前这个数据结构中的所有数据;
(4) 调用插入函数,要求在当前存放数据的第一个位置插入一个值为95的整型数据,并输出插入后的数据序列;
(5) 调用删除函数,要求删除当前存放数据中值为3的结点,并输出删除后的数据序列和删除的位置;
(6) 调用插入函数,要求在当前存放数据的值45后插入一个值为54的整型数据,并输出插入后的数据序列;
(7) 调用倒置函数,实现顺序表的就地倒置,并输出倒置后的数据。
(8) 调用奇偶分类函数,重新定义两个顺序表L1和L2,将偶数存放在L1中,奇数存放在L2中,并输出分类后的顺序表L1和L2的数据。
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 100
//定义顺序表的结构类型
typedef int DataType;
typedef struct
{
DataType data[MAXLEN];
int Length;
}SeqList;
SeqList L;
//定义顺序初始化
void InitList(SeqList *L){
L->Length=0;
}
//定义顺序表创建函数
void CreateList(SeqList *L,int n)
{
int i;
printf("请输入%d个整数: ",n);
for(i=0;i<n;i++)
scanf("%d",&L->data[i]);
L->Length=i;
}
//查找操作
int GetElem(SeqList *L,int i,DataType *x)
{
if(i<1||i>L->Length)
return 0;
else
{
*x=L->data[i-1];
return 1;
}
}
int Locate(SeqList *L,DataType x)
{
int i=0;
while(i<L->Length && L->data[i]!=x)
i++;
if(i>=L->Length)
return 0;
else
return i+1;
}
//插入操作
int InsElem(SeqList *L,int i,DataType x)
{
int j;
if(L->Length>=MAXLEN){
printf("顺序表已满");
return -1;
}
if(i<1 || i>L->Length+1){
printf("插入位置有误");
return 0;
}
if(i == L->Length+1){
L->data[i-1]=x;
L->Length++;
return 1;
}
for(j=L->Length-1;j>=i-1;j--)
L->data[j+1]=L->data[j];
L->data[i-1]=x;
L->Length++;
return 1;
}
//删除操作
int DelElem(SeqList *L,int i,DataType *x){
int j;
if(L->Length==0){
printf("顺序表为空");
return 0;
}
if(i<1 || i>L->Length){
printf("不存在第i个元素");
return 0;
}
*x=L->data[i-1];
for(j=i;j<L->Length;j++)
L->data[j-1]=L->data[j];
L->Length--;
return 1;
}
//输出表中元素操作
void DispList(SeqList *L){
int i;
for(i=0;i< L->Length;i++)
printf("%5d ",L->data[i]);
}
//显示菜单函数
void Menu()
{
printf("\n 顺序表的各种操作");
printf("\n==========================================");
printf("\n| 1--建立顺序表 |");
printf("\n| 2--插入元素 |");
printf("\n| 3--删除元素 |");
printf("\n| 4--按位置查找元素 |");
printf("\n| 5--按元素值查找其在表中位置元素 |");
printf("\n| 6--求顺序表的长度 |");
printf("\n| 7--倒置 |");
printf("\n| 8--奇偶分类 |");
printf("\n| 0--返回 |");
printf("\n==========================================");
printf("\n请输入菜单号(0-8):");
}
//倒置函数
void reverse(SeqList* L)
{
int i = 0, j = L->Length - 1, temp = 0;
while (i < j) {
temp = L->data[i];
L->data[i] = L->data[j];
L->data[j] = temp;
i++; j--;
}
}
//奇偶分类函数(奇数在左,偶数在右)
void move(SeqList *L)
{
int i=0,j=L->Length-1;
DataType tmp;
DataType data2[MAXLEN];
while (i<j)
{
while ((i<j) && (L->data[j]%2==0)) //从右往左,找到第一个奇数
j--;
while ((i<j) && (L->data[i]%2==1)) //从左往右,找到第一个偶数
i++;
if (i<j) //如果未到达"分界线",将右边的奇数和左边的偶数交换
{
tmp=L->data[i];
L->data[i]=L->data[j];
L->data[j]=tmp;
}
}
}
main()
{
SeqList L;
DataType x;
int n,i,loc;
char ch1,ch2,a;
ch1='y';
while(ch1=='y'||ch1=='Y'){
Menu();
scanf("%c",&ch2);
getchar();
switch(ch2)
{
case '1':
InitList(&L);
printf("请输入建立线性表的个数:");
scanf("%d",&n);
CreateList(&L,n);
printf("建立的线性表为:");
DispList(&L);
break;
case '2':
printf("请输入要插入的位置:");
scanf("%d",&i);
printf("请输入要插入的元素值:");
scanf("%d",&x);
if(InsElem(&L,i,x))
{
printf("已成功在%d的位置插入%d,插入后的线性表为:\n",i,x);
DispList(&L);
}
else
printf("输入插入的参数错误");
break;
case '3':
printf("请输入要删除元素的位置:");
scanf("%d",&i);
if(DelElem(&L,i,&x))
{
printf("已成功在%d的位置删除%d,删除后的线性表为:\n",i,x);
DispList(&L);
}
else
printf("\n输入删除的参数错误");
break;
case '4':
printf("请输入要查看表中元素位置(从1开始):");
scanf("%d",&i);
if(GetElem(&L,i,&x))
printf("当前线性表第%d个元素的值为:%d",i,x);
else
printf("输入的位置错误");
break;
case '5':
printf("请输入要查找的元素为:");
scanf("%d",&x);
loc=Locate(&L,x);
if(loc)
printf("查找元素值为%d的位置为:%d",x,loc);
else
printf("该表中无此元素");
break;
case '6':
printf("当前线性表的长度为:%d",L.Length);
break;
case '7':
reverse(&L);
printf("倒置后的线性表为:");
for (int i = 0; i < L.Length; i++) {
printf("%d ", L.data[i]);
}
return 0;
break;
case '8':
move(&L);
printf("操作后 ");
for (int i = 0; i < L.Length; i++) {
if(L.data[i]%2!=0)
printf("L2=%d\n", L.data[i]);
else{
printf("L1=%d\n", L.data[i]);
};
};
return 0;
break;
case '0':
ch1='n';
break;
default:
printf("输入有误,请输入0-7进行选择");
}
if(ch2!='0')
{
printf("\n按回车键继续,按任意键返回主菜单\n");
a=getchar();
if(a!='\xA')
{
getchar();ch1='n';
}
}
}
}


