栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

线性表-顺序存储结构

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

线性表-顺序存储结构

#include "stdio.h"
#include "stdlib.h"  //用到了srand函数,所以要有这个头文件

 

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 20


typedef int ElemType; 
typedef int Status;   

 

typedef struct
{
 ElemType data[MAXSIZE];
 int length;           
}SqList;

 

//因为要初始化,要对线性表本身进行操作,所以不能用值传递。值传递不会改变实参的值嘛。

//地址传递的话呢,实际上在函数内部执行了这么一个操作:L = &L. 所以操作函数内部的L,

//也就相当于操作外部的线性表L。其实地址传递也是值传递。不过这个值是地址而已。

//也就是说,需要修改表的就传指针,不需要修改表的传值就行了。
Status InitList(SqList *L) //初始化线性表
{
    L->length=0;
    return OK;
}

 

SqList Create(SqList L) //顺序表的建立
{
    int i;
   
    srand((unsigned)time(NULL));
    for(i=0; i < 10; i++)
   {
        L.data[i] = rand ( ) % 100; //产生0-100随机数
        L.length++;
   }
    return L;
}

Status ClearList(SqList *L) //清除线性表
{
    L->length = 0;
    return OK;
}

Status visit(ElemType c) //访问线性表
{
    printf("%d ",c);
    return OK;
}

Status ListTraverse(SqList L) //遍历线性表
{
 int i;
    for(i=0;i < L.length;i++)
        visit(L.data[i]); //访问线性表
    printf("n");
    return OK;
}

Status ListInsert(SqList *L,int i,ElemType e) //线性表插入
{                 //结构体指针 插入位置 ElemType=int插入的值
 int k;

 if (L->length==MAXSIZE)
  return ERROR;
 if (i < 1 || i>L->length+1)
  return ERROR;
  
 if (i <= L->length) //i带入插入位置
 {
  for(k=L->length-1;k>=i-1;k--) //遍历
       L->data[k+1]=L->data[k]; //往后移位
 }
 L->data[i-1]=e; //e带入插入的值
 L->length++; //线性表长度加1
   
 return OK;
}

Status ListDelete(SqList *L,int i,ElemType *e) //删除某个元素
{                            //结构体指针 删除位置
    int k;
    if (L->length==0) 
        return ERROR;
    if (i < 1 || i>L->length) 
        return ERROR;


    *e=L->data[i-1]; //i删除位置(变量就是“.”指针就是“->”)
    if (i < L->length) 
    {
        for(k=i; k < L->length; k++)
            L->data[k-1]=L->data[k];
    }
    L->length--;//线性表长度减1
    return OK;
}

 

//首先参数,我们需要传入线性表L,仅仅查找的话是不需要对表进行变化的,所以用值传递就行。

//然后就是传入需要查找元素的位置 i,最后还需要一个参数 *e,这个需要用地址传递,

//因为要保存函数的查找结构。

Status GetElem(SqList L,int i,ElemType *e) //查找表中元素
{
    if(L.length==0 || i < 1 || i>L.length)
        return ERROR;


    *e=L.data[i-1];
    return OK;
}

int ListLength(SqList L) //线性表长度
{
    return L.length;
}

Status ListEmpty(SqList L) //线性表是否为空
{
    return (L.length == 0)? TRUE : FALSE;
}

int LocateElem(SqList L,ElemType e) //判断元素是否在表中
{
    int i;
    if (L.length==0)
        return 0;
    for(i=0;i < L.length;i++)
    {
        if (L.data[i]==e)
            break;
    }
    if(i>=L.length)
        return 0;
  
    return i+1;
}

int main(void)
{
    SqList L; ElemType e; Status i; int opp;
    int j,k;
    int pos;
    ElemType value;
  
    i=InitList(&L);//初始化线性表
    printf("初始化成功,L.length=%dn",L.length);
    printf("n1.遍历线性表 n2.线性表赋值 n3.清空线性表 n4.线性表插入 n5.查找表中元素 n6.判断元素

   是否在表中 n7.删除某个元素 n8.线性表长度n9.线性表是否为空n0.退出 n请选择你的操作:n");
    while(opp != 0)
   {
        scanf("%d",&opp);
        switch(opp)
        {
            case 1:
                ListTraverse(L); //遍历线性表
                printf("n");
                break;
              
            case 2:
                L = Create(L);
                printf("创建随机链表:L.data="); //线性表赋值
                ListTraverse(L); //遍历线性表
                printf("n");
                break;
              
            case 3:
                i=ClearList(&L);
                printf("清空L后:L.length=%dn",L.length); //清空线性表
                ListTraverse(L); //遍历线性表
                printf("n");
                break;
               
            case 4:
                printf("请输入插入元素位置:"); //线性表插入
                scanf("%d",&pos);
                printf("请输入插入元素的值:");
                scanf("%d",&value);
                i = ListInsert(&L,pos,value); //线性表插入
                printf("插入完毕,现在线性表为:n");
                ListTraverse(L); //遍历线性表
                printf("n");
                break;
              
            case 5:
                printf("你要查找第几个元素? "); //查找表中元素
                scanf("%d",&pos);
                GetElem(L,pos,&e); //查找表中元素
                printf("第%d个元素的值为:%dn",pos,e);
                break;
              
            case 6:
                printf("输入你想知道是否在表中的数值: "); //判断元素是否在表中
                scanf("%d",&e);
                k=LocateElem(L,e); //判断元素是否在表中
                // 这里假定随机数组中的元素互不重复
                if(k)
                    printf("值为%d是表中的第%d个元素n",e,k);
                else
                    printf("没有值为%d的元素n",e);
                break;
              
            case 7:
                printf("要删除第几个元素?"); //删除某个元素
                scanf("%d",&pos);
                ListDelete(&L,pos,&e); //删除某个元素(实验时&e可以去掉)
                printf("删除完毕,现在线性表为:n");
                ListTraverse(L); //遍历线性表
                printf("n");
                break;
              
            case 8:
                k = ListLength(L); //线性表长度
                printf("线性表的长度为: %d n", k);
                break;
              
            case 9:
                i = ListEmpty(L); //线性表是否为空
                if (i)
                    printf("该线性表为空.n");
                else
                    printf("该线性表非空n");
                break;
              
            case 0:
                exit(0); //退出
        }
    }
}

----------------------------------------------------------------------------------------------------------------

附录

1、参考:第01话:线性表的概念与定义 -- 简明现代魔法

----------------------------------------------------------------------------------------------------------------

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/884125.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号