线性表实验实现基本操作(C语言版)

1、问题描述

   顺序表是指采用顺序存储结构的线性表,它利用内存中的一片起始位置确定的连续存储区域来存放表中的所有元素。可以根据需要对表中的任何数据元素进行访问,元素的插入、删除可以在表中的任何位置进行。

2、数据结构设计

由于C语言中一维数组(即向量)也是采用顺序表存储表示,因此可以用一维数组elem[MAXSIZE]来描述顺序表,其中MAXSIZE是预先设定的常数,至于顺序表的长度(即线性表中元素的数目)可用一个整形变量length来表示,元素类型假定为ElemType(ElemType可以是任何相应的数据类型如int、char等),用结构类型来定义顺序表的类型。

#define MAXSIZE 100

#define ERROR -1

 

typedef int ElemType; 

 

typedef struct {

        ElemType elem[MAXSIZE];

        int length;

        }SqList;//线性表定义

 

3、功能函数说明:

顺序表的基本操作:

InitList(SqList &L)//初始化操作,将线性表置空

CreatList(SqList &L,int n)//建立一个顺序存储的线性表

IsEmpty(SqList L)//判断表是否为空,为空返回1

Compare(SqList L1,SqList L2) //比较两个顺序表的大小

Inversion(SqList &L)//将一个顺序表逆置

GetElem(SqList L,int i) //取表中第i元素

LocateElem(SqList L,ElemType x) 

//定位函数,返回L中与第一个与x相等的数据元素的位置(从1算起),否则返回值为0 

ListInsert(SqList &L,ElemType x,int i)

//在线性表L中第i个数据元素之前插入一个数据元素x 

Delete(SqList &L,int i)

//除线性表L中第i(0<=i<L.length)个数据元素

Clear(SqList &L)//清空线性表L

 

void MergeList(SqList &la,SqList &lb,SqList &lc)//合并有序表la,lb到表lc中,使得表lc依然有序

4、编码实现:

#define MAXSIZE 100

#define ERROR 0

#include<iostream>

#include<cstdio>

using namespace std;

 

typedef int ElemType; 

 

typedef struct {

        ElemType elem[MAXSIZE];

        int length;

        }SqList;

 

void InitList(SqList &L)//初始化操作,将线性表置空

{

     L.length 0; 

 

void CreatList(SqList &L,int n)//建立一个顺序存储的线性表

{

     int i;

     for(i 0;i n; i++)

        scanf("%d",&L.elem[i]);

     L.length n; 

     fflush(stdin);

 

void Output(SqList L)//输出线性表L 

{

     int i;

     for(i 0;i L.length;i++)

           printf("%d ",L.elem[i]);

     printf("\n");

 

int IsEmpty(SqList L)//判断表是否为空,为空返回1 

{

    if(L.length == 0)

           return 1;

       else

           return 0;

 

int Compare(SqList L1,SqList L2) //比较两个顺序表的大小

{

// 若 A<B,则返回 -1;若 A=B,则返回 0;若 A>B,则返回 1

int 0;

while(i<L1.length && i<L2.length)

{

if(L1.elem[i] L2.elem[i])

return 1;

else if(L1.elem[i] L2.elem[i])

return -1;

else i++;

}

if L1.length == L2.length 

return 0;

else if(L1.length L2.length)

return -1;

else 

return 1;

}

 

int Inversion(SqList &L)//将一个顺序表逆置

{

int i,temp;

for(i=0;i<L.length/2;i++)

{

temp L.elem[i];

L.elem[i] L.elem[L.length-i-1];

L.elem[L.length-i-1] temp;

}

return 1;

}

 

int GetElem(SqList L,int i) //取表中第i元素 

{

    if(i 0||i >= L.length)

       return ERROR;

    else 

       return L.elem[i];

}

 

int LocateElem(SqList L,ElemType x) 

//定位函数,返回L中与第一个与x相等的数据元素的位置(从1算起),否则返回值为0 

{

     int 0;

     while(k <= L.length && L.elem[k] != x)

     k++;

     if(k <= L.length)  

          return ++k;

     else 

          return -1;

 

int ListInsert(SqList &L,ElemType x,int i)

//在线性表L中第i个数据元素之前插入一个数据元素x 

{

       int k;

       if(i || L.length || L.length == MAXSIZE)

            return 0;

       else 

       {

            for(k L.length;k >= i;k--)

            L.elem[k] L.elem[k-1];

            L.elem[i] x;

            L.length L.length 1;

       }

       return 1;

}

 

int Delete(SqList &L,int i)//删除线性表L中第i(0<=i<L.length)个数据元素 

{

    int k;

    if(i || >= L.length)//下标越界 

       return 0;

    else//移动后面的元素

    {

        for(k i;k L.length;k++)

        L.elem[k]  L.elem[k+1];

        L.length--;

    

    return 1;

}

 

void Clear(SqList &L)//清空线性表L

{

     InitList(L);

 

void MergeList(SqList &la,SqList &lb,SqList &lc)//合并有序表la,lb到表lc中,使得表lc依然有序 

{

     int i,j,k;

     0;

     while(i la.length && la.length)//la和lb均不空

if(la.elem[i] lb.elem[j])

lc.elem[k++] la.elem[i++];

else if(la.elem[i] lb.elem[j])

lc.elem[k++] lb.elem[j++];

else //la和lb中的当前元素相等时,同时移动指针 

{

            lc.elem[k++] lb.elem[j++];

++i;

}

     while(i la.length)//la非空,lb已空 

         lc.elem[k++] la.elem[i++];

     while(j lb.length)//la已空,lb非空

         lc.elem[k++] lb.elem[j++];

     lc.length k; 

}

 

int SortInc(SqList &L)//对顺序表数据元素按升序排列

{

//用冒泡法排序

int temp;

for(int 0;i L.length 1;i++)

for(int i;j L.length;j++)

{

if(L.elem[i] L.elem[j])

{

temp L.elem[i];

L.elem[i] L.elem[j];

L.elem[j] temp;

}

}

return 0;

}

 

int SortDec(SqList &L)//对顺序表数据元素按降序排列

{

//用冒泡法排序

int temp;

for(int L.length 1;i 0;i--)

for(int i;j >= ;j--)

{

if(L.elem[i] L.elem[j])

{

temp L.elem[i];

L.elem[i] L.elem[j];

L.elem[j] temp;

}

}

return 0;

}

 

void output()

{

     int i;

     for(i 0;i 10;i ++)

        printf(" ");

     for(i 0;i 32;i ++)

        printf("*");

     printf("\n");

}

 

void mainpp()//显示窗口

{

     int i;

     output();

     for(i 0;i 10;i ++)

        printf(" ");

        printf("*   ");

     printf("1.建立一个顺序表");

     for(i 0;i 10;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     for(i 0;i 10;i ++)

        printf(" ");

        printf("*   ");

     printf("2.输出一个顺序表");

     for(i 0;i 10;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     for(i 0;i 10;i ++)

        printf(" ");

        printf("*   ");

     printf("3.在顺序表中查找");

     for(i 0;i 10;i ++)

        printf(" ");

        printf("*");

        printf("\n");

     for(i 0;i 10;i ++)

        printf(" ");

        printf("*   ");

     printf("4.向顺序表中插入一个元素");

     for(i 0;i 2;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     for(i 0;i 10;i ++)

        printf(" ");

        printf("*   ");

     printf("5.删除顺序表中的一个元素");

     for(i 0;i 2;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     for(i 0;i 10;i++)

        printf(" ");

        printf("*   ");

     printf("6.从顺序表中取出一个元素");

     for(i 0;i 2;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     for(i 0;i 10;i++)

        printf(" ");

        printf("*   ");

     printf("7.将两个顺序表合并");

     for(i 0;i 8;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     for(i 0;i 10;i++)

        printf(" ");

        printf("*   ");

 printf("8.比较两个顺序表的大小");

     for(i 0;i 4;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     for(i 0;i 10;i++)

        printf(" ");

        printf("*   ");

 printf("9.将顺序表逆置");

     for(i 0;i 12;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     for(i 0;i 10;i++)

        printf(" ");

        printf("*   ");

 printf("10.将顺序表中升序排序");

     for(i 0;i 5;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     for(i 0;i 10;i++)

        printf(" ");

        printf("*   ");

 printf("11.将顺序表中降序排序");

     for(i 0;i 5;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     for(i 0;i 10;i++)

        printf(" ");

        printf("*   ");

 printf("12.判断顺序表中是否为空");

     for(i 0;i 5;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     for(i 0;i 10;i++)

        printf(" ");

        printf("*   ");

     printf("0.退           出 "); 

     for(i 0;i 8;i++)

        printf(" ");

        printf("*");

        printf("\n"); 

     output(); 

}

 

int main()//主函数

{

     int n,i,k 1,m,p,q,x;

     SqList l,la,lc;

     InitList(l);

     mainpp();

     while(k) 

     {

           printf("请选择0--12:");

           scanf("%d",&m);

           getchar();

           switch(m)

           {

                  case 0:exit(0);

                  case 1:{

                       printf("请输入顺序表元素的个数:\n"); 

   printf("输入元素值,构建顺序表:\n");

                       scanf("%d",&n);

                       CreatList(l,n);

                       Output(l);

                       break;

                        

                  case 2:Output(l);printf("\n");break;

                  case 3:{

                       printf("请输入要查找的元素值:");

                       scanf("%d",&x);

                       LocateElem(l,x);

                       printf("要查找的元素的定位:%d\n",k);

                       printf("\n");

                       break;

                       }

                  case 4:{

                       printf("请输入要插入的元素的位置及其值:");

                       fflush(stdin);

                       scanf("%d",&i);

                       scanf("%d",&x);

                       ListInsert(l,x,i);

                       Output(l);

                       printf("\n");

                       break;

                       }

                  case 5:{

                       printf("请输入要删除元素的位置:");

                       fflush(stdin);

                       scanf("%d",&i);

                       Delete(l,i); 

                       Output(l);

                       printf("\n");

                       break;

                       }

                  case 6:{

                       printf("请输入要取出的元素的序号:");

                       fflush(stdin);

                       scanf("%d",&i);

                       GetElem(l,i);

                       printf("取出的第%d个元素为:%d\n",i,k);

                       break;

                       }

                  case 7:{

                       InitList(la);

   InitList(lc);

                       printf("请输入第2个顺序表元素的个数: \n");

   printf("输入元素值,构建顺序表:\n");

                       scanf("%d",&m);

                       CreatList(la,m);

   printf("\n新建的顺序表为:\n");

                       Output(la);

                       MergeList(l,la,lc); 

                       printf("输出合并后的顺序表中的元素:\n");

                       Output(lc);

                       break;

                       }

  case 8:{

                       InitList(la);

                       printf("请输入第2个顺序表元素的个数: \n");

   printf("输入元素值,构建顺序表:\n");

                       scanf("%d",&m);

                       CreatList(la,m);

   printf("\n新建的顺序表为:\n");

                       Output(la);

                       Compare(l,la);

   if(p == 1)

   printf("l la");

   else if(p == -1)

   printf("l la");

   else 

   printf("l == la");

                       break;

                       }

  case 9:{

  Inversion(l);

                      Output(l);

                      printf("\n");

                      break;

                      }

  case 10:{

  SortInc(l);

                      Output(l);

                      printf("\n");

                      break;

                      }

  case 11:{

  SortDec(l);

                      Output(l);

                      printf("\n");

                      break;

                      }

  case 12:{

  IsEmpty(l);

  if(q == 1)

  printf("此表为空");

  else

      printf("此表不空");

                   printf("\n");

                   break;

                   }

                  default :exit(0);

            

           printf("继续运行吗?Y(1)/N(0):");

           scanf("%d",&k);

           if(!k)

           exit(0); 

     

 return 0;

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值