顺序表算法应用
利用顺序表数据类型解决实际问题,内容如下:
(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'; } } } }