线性表

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
    ElemType a[MAXSIZE];
    int length;
}SqList;
SqList a,b,c;
void creat_list(SqList *L);
void out_list(SqList L);
void insert_sq(SqList *L,int i,ElemType e);
ElemType delete_sq(SqList *L,int i);
int locat_sq(SqList L,ElemType e);
int len_list(SqList *L);
void reverse(SqList *L);
ElemType dell(SqList *L,int e);
ElemType alldell(SqList *L,int e);
void insert(SqList *L,int e);
int main( )
{
    int i,k,loc;
    ElemType e,x;
    char ch;
    do{
        printf("\n\n\n");
        printf("\n    1.建立线性表");
        printf("\n    2.在i位置插入元素e");
        printf("\n    3.删除第i个元素,返回其值");
        printf("\n    4.查找值为e的元素");
        printf("\n    5.删除首次出现值为x的元素");
        printf("\n    6.删除所有值为x的元素");
        printf("\n    7.输出顺序表的各结点的值");
        printf("\n    8.求顺序表的长度");
        printf("\n    9.在顺序表的末尾插入数e");
        printf("\n    10.将顺序表逆置");
        printf("\n    11.结束程序运行");
        printf("\n ---------------------");
        printf("\n    请输入您的选择(1,2,3,4,6,8,11)");
       scanf("%d",&k);
       switch(k)
       {
        case 1:
            {   creat_list(&a);
                out_list(a);
            }      break;
        case 2:
            {
                printf("\n i,e=?");
                scanf("%d%d",&i,&e);
                insert_sq(&a,i,e);
                out_list(a);
            } break;
        case 3:
            {
                printf("\n i=?");
                scanf("%d",&i);
                x=delete_sq(&a,i);
                out_list(a);
                printf("\n x=%d",x);
            } break;
        case 4:
            {
                printf("\n e=?");
                scanf("%d",&e);
                loc=locat_sq(a,e);
                if(loc==-1)
                    printf("\n未找到 %d",loc);
                else
                    printf("\n已找到,元素位置是%d",loc);
            }break;
        case 5:
            {
               scanf("%d",&e);
               dell(&a,e);
               out_list(a);
            } break;
        case 6:
            {
               scanf("%d",&e);
               alldell(&a,e);
               out_list(a);
            } break;
        case 7:
            {
               out_list(a);
            } break;
        case 8:
            {
                len_list(&a);
            }      break;
        case 9:
            {
                scanf("%d",&e);
                insert(&a,e);
                out_list(a);
            }      break;
        case 10:
            {
               reverse(&a);
               out_list(a);
            }    break;
        }
       }while (k!=11);
       printf("\n 再见!");
       printf("\n 按enter键,返回");
       ch=getchar();
}
//建表
void creat_list(SqList *L)
{
    int i;
    printf("\n n=?");
    scanf("%d",&L->length);  //输入表长
    for(i=0;i<L->length;i++)
    {
        printf("\n data %d=?",i);
        scanf("%d",&(L->a[i]));
    }
}
//输出
void out_list(SqList L)
{
    int i;
    char ch;
    printf("\n");
    for(i=0;i<=L.length-1;i++)		//O(n)
        printf("%10d",L.a[i]);
        printf("\n\n    按enter键,继续");
        ch=getchar();
}
//在第i个位置插入元素e
void insert_sq(SqList *L,int i,ElemType e)
{
    int j;
    if(L->length==MAXSIZE)
        printf("\n overflow!");
    else if(i<1||i>L->length+1)
        printf("\n erroe i !");  //插入位置不在表的范围内
    else
        {
            for(j=L->length-1;j>=i-1;j--)		//O(n)
                    L->a[j+1]=L->a[j];  //向后移动数据元素
                    L->a[i-1]=e;     //插入元素
                    L->length++;     //增加表长
        }
}
//删除第i个元素,返回其值
ElemType delete_sq(SqList *L,int i)
{
     ElemType x;
     int j;
     if(L->length==0)
        printf("\n 是空表。underflow !");
     else if (i<1||i>L->length)
        {
            printf("\n error i !");
            x=-1;
        }
     else
        {
            x=L->a[i-1];   //找到第i个元素的位置
            for(j=i;j<=L->length-1;j++)	//O(n)
                L->a[j-1]=L->a[j];  //第i+1个位置覆盖第i个位置
                L->length--;
        }
     return(x);
}
//查找值为e的元素,返回其位置
int locat_sq(SqList L,ElemType e)
{
    int i=0;
    while(i<=L.length-1&&L.a[i]!=e)
        i++;
    if(i<=L.length-1)
        return(i+1);
    else
        return(-1);
}
//求顺序表的长度
int len_list(SqList *L)
{
     printf("%d",L->length);
}
//将顺序表逆置
void reverse(SqList *L)
{
    int t,i,j;
    j=L->length-1;              //两头互换
    for(i=0;i<j;i++,j--)
    {
        t=L->a[i];
        L->a[i]=L->a[j];
        L->a[j]=t;
    }
}
//删除首次出现值为x的元素
ElemType dell(SqList *L,int e)
{  int  i=0,k;
    while(i<L->length)
    {
        if(L->a[i]!=e)
                i++;  //找到第一个出现值为e的位置
        else
        {
            for(k=i+1;k<L->length;k++)		//O(n)
                L->a[k-1]=L->a[k];   //e后面的值向前移,覆盖e
                L->length--;
                break ;
        }
    }
    if (i>L->length)
    {
        printf("要删除的数据元素不存在!\n") ;
        return 0;
    }
    return  1;
}
//删除所有值为x的元素
ElemType alldell(SqList *L,int e)
{
    int  i=0,k=0;
    while(i<L->length)
    {
        if(L->a[i]==e)
                k++;        //值为e的个数
        else
            L->a[i-k]=L->a[i];  //当前元素向前移k个位置
            i++;
    }
    L->length-=k;
    if (i>L->length)
    {
        printf("要删除的数据元素不存在!\n") ;
        return 0;
    }
    return  L->length;
}
//在顺序表的末尾插入数e
void insert(SqList *L,int e)
{
    L->length+=1;        //表长+1
    L->a[L->length-1]=e;   //末尾插入数字e
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值