/*线性表基本操作
定义结构体Sqlist线性表类型
InitList_Sq(Sqlist *L)建表
InputList_Sq(SqList *L, int n)输入数据
PrintList_Sq(SqList L)输出数据
MergListe_Sq(SqList *La, SqList *Lb, SqList *Lc)
合并序列
******以上几个方法是方法体中的法名及定义
******以下为int main中的法名
lookprintf_Sq(&L,item);
查找元素item并输出位置
DeleteItem_Sq (&L, item)
删除等于指定值item的元素
ListInsert_Sq(&SL,i,e);
在指定位置i插入元素e
ListInsert_Sq(&L,item);
在有序线性表中插入元素item
delite_Sq(&L);
删除位置s到t之间的元素
max_Sq(&L);
找出并输出最大值
Delite_Sq(&L,i);
删除指定位置i的元素并输出剩余的
min_Sq(&L);
找输出线性表中的最小值
地址指针&用箭头,结构的实例用点。*&L=L
*/
#include <stdlib.h>
#include <stdio.h>
#define LIST_INIT_SIZE 20
#define LISTINCREMENT 10
#define OK 1
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType *elem;
int length;
int listsize;
}SqList;
//建表1
Status InitList_Sq(SqList *L)
{
L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)exit(OVERFLOW);
L->length=0;
return 1;
}
建表2
//Status InitList_Sq(SqList &L){
// L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
// if(!L.elem)exit(OVERFLOW);
// L.length=0;
// return 1;
//}
//输入数据
void InputList_Sq(SqList *L, int n)
{
//1,输入元素个数换行,分别输入元素
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&L->elem[i]);
L->length++;}
}
//输出序列
void PrintList_Sq(SqList L)
{
int n=L.length;
for(int i=0;i<n;i++){
printf("%d ",L.elem[i]);
}
}
//合并序列
Status MergListe_Sq(SqList *La, SqList *Lb, SqList *Lc)
{
int i=0, j=0, k=0;
//同时扫描两个表
while(i<La->listsize && j<Lb->listsize)
{
if(La->elem[i]<=Lb->elem[j])
{
Lc->elem[k] = La->elem[i];
i++;
k++;
}
else
{
Lc->elem[k] = Lb->elem[j];
j++;
k++;
}
}
//A表扫完,B组未扫完
if(i==La->listsize)
{
for(; j<Lb->listsize; j++)
{
Lc->elem[k] = Lb->elem[j];
k++;
}
}
if(j==Lb->listsize)
{
for(; i<La->listsize; i++)
{
Lc->elem[k] = La->elem[i];
k++;
}
}
Lc->listsize=k;
}
//查找元素item并输出
void lookprintf_Sq(SqList *L, ElemType item)
{
int k=0;
int i=0;
int j=-1;
int flag=0;
scanf("%d",&item); //想删除的item的元素
for(i=0;i<L->length;i++)
{
if (L->elem[i]==item)
{
k=i+1;
flag=1;
}
}
if(flag==1)printf("%d",k);
if(flag==0)printf("%d",j);
}
//删除数据
Status DeleteItem_Sq (SqList *L, ElemType item)
{
int k=0;
int i=1;
scanf("%d",&item); //k记录值等于item的元素个数
while (i<=L->length)
{ if (L->elem[i]==item)
k++;
else //当前元素前移k个位置
L->elem[i-k]=L->elem[i];
i++;
}
L->length=L->length-k; //顺序表A的长度递减
}
//在指定位置i插入元素e
Status ListInsert_Sq(SqList *L,int i,ElemType e)
{
scanf("%d",&i);
scanf("%d",&e);
if (i<1 || i>L->length+1) return 0; //i值不合法
//在线性表L的i位置插入e
int k;
for (k = L->length-1; k >=i-1; k--) {
L->elem[k + 1] = L->elem[k];
//将i位置后面的元素都赋值到后一位
}
L->elem[i - 1] = e;
L->length++;
//增长线性表
return 0;
}
//在有序线性表中插入元素item
Status ListInsert_Sq(SqList *L,ElemType item)
{
scanf("%d",&item);
int i;
for(i=L->length-1;i>=0&&L->elem[i]>item;i--){
L->elem[i+1]=L->elem[i];
}
L->elem[i+1]=item;
L->length++;
return 1;
}
//删第j个起的k个元素
Status delite_Sq(SqList *L)
{
int s;
int t;
scanf("%d",&s);
scanf("%d",&t);
if(s>=t)return OVERFLOW;
if(L->elem=NULL)return OVERFLOW;
for(int i=0;i<L->length;i++){
if(L->elem[i]>=s&&L->elem[i]<=t){
for(i;i<L->length;i++){
L->elem[i]=L->elem[i+1];
}
L->length--;
i=i-1;
}
}
return true;
//将j位置后面的元素都赋值到前一位
//减少线性表
}
//找min
void min_Sq(SqList *L)
{
int min=-10000;
int flag2=0;
for(int ii=0;ii<L->length;ii++){
if(L->elem[ii]<min){
flag2=ii;
min=L->elem[ii];
}
}
int flag=++flag2;
for (int k = flag; k <=L->length; k++) {
L->elem[k - 1] = L->elem[k];
//将flag位置后面的元素都赋值到前一位
}
L->length--;
//减少线性表
}
//找出并输出最大值
void max_Sq(SqList *L)
{
int max=0;
int flag1=0;
for(int xx=0;xx<L->length;xx++){
if(L->elem[xx]>max){
flag1=xx;
max=L->elem[xx];
}
}
printf("%d\n",++flag1);
}
//删除指定位置i的元素并输出剩余的
Status Delite_Sq(SqList *L,int i)
{
scanf("%d",&i);
int j=-1;
if (i<1 || i>L->length)
{printf("%d",j);} //i值不合法,输出-1
else
{//合法,线性表L的i位置删除
int k;
for (k =i;k<L->length; k++) {
L->elem[k -1] = L->elem[k];
//将i位置后面的元素都赋值到前一位
}
int flag=1;
L->length--;//缩短线性表
//输出线性表
int n=L->length;
for(int i=0;i<n;i++){
printf("%d ",L->elem[i]);
}
}
return 0;
}
int main()
{
SqList La,Lb,Lc,L;
int len1,len2,item;
InitList_Sq(&La);
InitList_Sq(&L);
InputList_Sq(&La,len1);
InitList_Sq(&Lb);
InputList_Sq(&Lb,len2);
MergListe_Sq (&La, &Lb, &Lc);
lookprintf_Sq(&L,item);
ListInsert_Sq(&L,item);
DeleteItem_Sq (&L,item);
ListInsert_Sq(&L,i,e);
delite_Sq(&L);
min_Sq(&L);
max_Sq(&L);
Delite_Sq(&L,i);
PrintList_Sq(Lc);
return 0;
}
数据结构--初学线性表
最新推荐文章于 2024-08-29 18:01:01 发布