zoukankan      html  css  js  c++  java
  • 3.2.2 线性表的顺序存储实现

    #include<stdio.h>
    #include<stdlib.h>
    # define MAXSIZE 1000
    # define ERROR -1
    typedef int position;
    typedef struct LNode * PtrToLNode;
    struct LNode{
        int Data[MAXSIZE];
        position Last;
    }; 
    typedef PtrToLNode List;
    
    List MakeEmpty()//1.初始化 
    {
        List L;
        L=(List)malloc(sizeof(struct LNode));
        L->Last=-1;
        return L;
    }
    
    position Find(List L,int X)//2.查找 
    {
        position i=0;
        while(i<=L->Last&&L->Data[i]!=X)
            i++;
        if(i>L->Last)
            return ERROR;
        else
            return i;
    }
    
    bool Insert(List L,int X,int i)
    {/*在L的制定位序i前插入一个新元素X;位序i元素的数组位置下标是i-1*/
        position j;
        
        if(L->Last==MAXSIZE-1)
        {/*表空间已满,不能插入*/
            printf("表满,不能插入
    
    ");
            return false; 
        }
        if(i<1||i>L->Last+2)
        {/*检查插入位序的合法性:是否在1~n+1。n为当前元素个数,即Last+1*/ 
            printf("位序不合法
    
    ");
            return false; 
        }
        for(j=L->Last;j>i-1;j--)//List指向序列最后元素 
            L->Data[j+1]=L->Data[j];//将位序i及以后的元素顺序向后移动 
        L->Data[i-1]=X;//插入数据 
        L->Last++;//Last仍指向最后元素 
        return true; 
    }
    
    bool Delete(List L,int i)//删除 
    {
        position j;
        
        if(i<1||i>L->Last+1)
        {
            printf("位序%d不存在
    
    ",i);
            return false;
        }
        for(j=i;j<=L->Last;j++)
            L->Data[j-1]=L->Data[j];
        L->Last--;
        return true;
     } 
    
    void Length(List L)//求表长 
    {
        position j;
        position count=0;
        for(j=0;j<L->Last+1;j++)
            count++;
        printf("表的长度:%d
    
    ",count);
    }
    void Print(List L)//打印 
    {
        position j;
        printf("数据元素:");
        for(j=0;j<L->Last+1;j++)
            printf("%d ",L->Data[j]);
        printf("
    
    ");
    }
    
    void Menu()//菜单 
    {
        int chose; 
        int X,i; 
        List L;
        printf("	线性表的顺序存储实现
    "); 
        printf("1.创建顺序表	2.向顺序表插入数据
    3.查找数据	4.删除数据
    5.求表长	6.打印顺序表
    7.清屏		8.退出
    "); 
        printf("请输入您的操作:");
        scanf("%d",&chose);
        switch(chose)
        {
            case 1: 
                {
                    L=MakeEmpty();
                    printf("顺序表创建完成
    
    ");
                    break;
                }
            case 2: 
                {
                    printf("请输入您想要插入的数据以及位置: ");
                    scanf("%d%d",&X,&i);
                    Insert(L,X,i);
                    printf("
    
    ");
                    break;
                }
            case 3:
                {
                    printf("请输入您要查找的数据:");
                    scanf("%d",&X); 
                    Find(L,X);
                    printf("%d元素的位置为%d
    
    ",X,Find(L,X)+1);
                    break;
                }
            case 4:
                {
                    printf("请输入您想要删除的下标:");
                    scanf("%d",&i);
                    Delete(L,i);
                    printf("操作完成
    
    ");
                    break;
                }
            case 5:
                {
                    Length(L);
                    printf("
    
    ");
                    break;
                }
            case 6:
                {
                    Print(L);
                    printf("
    
    ");
                    break;
                }
            case 7:
                {
                    system("cls");
                    break;
                }
            case 8:
                {
                    exit(0);
                }
            default:printf("输入有误!
    
    ");
        }
            
    } 
    int main()
    {
        while(1)
        {    
            Menu();
            //printf("按Enter键继续...
    "); 
        }
        return 0;
    }

     对部分代码的解释:

    typedef int position;
    typedef struct LNode * PtrToLNode;
    struct LNode{
        int Data[MAXSIZE];
        position Last;
    }; 
    typedef PtrToLNode List;

    变量Last记录当前线性表中最后一个元素在数组中的位置,即Last起一个指针(实际是数组下标)的作用,始终指向线性表中最后一个元素。表空时Last=-1。

    i 0 1 ... i-1 i ... n-1 ... MAXSIZE-1
    Data a1 a2 ... ai ai+1 ... an ...  



                          线性表的顺序存储示意图

    由于LNode是一个包含数组的结构,当我们实现各种针对顺序表的操作时,直接将该结构作为函数参数传递显然不是个好方法,使用结构指针传递效率更高,所以我们把List定义为结构指针。
    这样,我们可以利用List定义线性表L:
        List L;
    通过L我们可以访问相应线性表的内容。比如下标为i的元素可以通过L-Data[i]访问,线性表的长度可以通过L->Last+1得到。
  • 相关阅读:
    JavaScript的continue、break和return的区别
    JavaScript的函数和作用域闭包
    利用反射快速给Model实体赋值
    C# 多态的实现
    C# 去除字符串首尾字符或字符串
    C#中大List的内存分配
    C#实现对图片文件的压缩、裁剪操作实例
    StringBuilder String string.Concat 字符串拼接速度
    C# 事件浅析
    理解 Thread.Sleep 函数
  • 原文地址:https://www.cnblogs.com/nyist0/p/9107733.html
Copyright © 2011-2022 走看看