zoukankan      html  css  js  c++  java
  • 数据结构之线性表

    一、线性表的顺序存储实现,利用数组实现线性表

    typedef struct{
        int Data[MAXSIZE];
        int Last;
    }List;
    
    List *MakeEmpty()
    {
        List *PtrL;
        PtrL=(List*)malloc(sizeof(List));
        PtrL->Last=-1;
        return PtrL;
    }
    int FindKth( int K, List* PtrL )  //根据位序K,返回相应元素
    {
        return PtrL->Data[K-1];
    }
    int Find(int X, List *PtrL )//在线性表L中查找X的第一次出现位置;
    {
        int i=0;
        while (i<=PtrL->Last&&PtrL->Data[i]!=X)
        {
            i++;
        }
        if (i>PtrL->Last)
        {
            return -1;
        }
        else
        {
            return i;
        }
    }
    void Insert(int X, int i, List *PtrL)//:在位序i前插入一个新元素X;
    {
        int j;
        if (PtrL->Last==MAXSIZE-1)
        {
            printf("the list is full already");
        }
        if (i>=PtrL->Last+2)
        {
            printf("the insert position is invalid");
        }
    
        for (j = PtrL->Last; j >=i-1; j--)
        {
            PtrL->Data[j+1]=PtrL->Data[j];
        }
        PtrL->Data[i]=X;
        PtrL->Last++;
    }
    void Delete( int i, List *PtrL)//:删除指定位序i的元素;
    {
        int j;
        if (i<1||i>PtrL->Last+1)
        {
            printf("the number you asked is not existed");
        }
        for (j=i;j<=PtrL->Last;j++)
        {
            PtrL->Data[j-1]=PtrL->Data[j];
    
        }
    
        PtrL->Last--;
    }
    int Length( List *PtrL )//:返回线性表L的长度n
    {
        return PtrL->Last+1;
    }
    void showAll(List *PtrL)
    {
        int i;
        for (i = 0; i <=PtrL->Last; i++)
        {
            printf("%d ",PtrL->Data[i]);
        }
    }
    
    void main1()
    {
        int i;
        List *PtrL;
        int a,b;
        printf("1.create a empty list
    ");
        printf("2.insert a number
    ");
        printf("3.query a number first appear
    ");
        printf("4.query a number by index
    ");
        printf("5.delete a number
    ");
        printf("6.show the length of the list
    ");
        printf("7.showall
    ");
        printf("8.exit
    ");
        while (1)
        {
        printf("please enter you order:");
        scanf("%d",&i);
        switch (i)
        {
        case 1:
            PtrL=MakeEmpty();
            break;
        case 2:
            printf("please enter what and where do you want to inset :");
            scanf("%d%d",&a,&b);
            Insert(a,b,PtrL);
            break;
        case 3:
            printf("please enter what do you want to query:");
            scanf("%d",&a);
            Find(a,PtrL);
            break;
        case 4:
            printf("please enter what do you want to query:");
            scanf("%d",&a);
            FindKth(a,PtrL);
            break;
        case 5:
            printf("please enter which index do you want to delete:");
            scanf("%d",&a);
            Delete(a,PtrL);
            break;
        case 6:
            printf("the length is%d:",Length(PtrL));
            break;
        case 7:
            showAll(PtrL);
            break;
        case 8:
            exit(1);
        }
        }
    }

    顺序存储实现

    线性表的链式存储实现,利用链表实现

    typedef struct Node{
        int Data;
        struct Node *Next;
    } List;
    
    int Length(List *PtrL)
    {
        List *p=PtrL;
        int j=0;
        while (p)
        {
            p=p->Next;
            j++;
        }
    
        return j;
    }
    
    List *FindKth( int K, List *PtrL)
    {
        List *p=PtrL;
        int i=1;
        while (p!=NULL&&i<K)
        {
            p=p->Next;
            i++;
        }
    
        if (i==K)
        {
            return p;
        }
        else
        {
            return NULL;
        }
    
    }
    
    List *Find( int X, List *PtrL )
    {
        List *p=PtrL;
        while (p&&p->Data!=X)
        {
            p=p->Next;
        }
        return p;
    }
    
    List *Insert( int X, int i, List *PtrL )
    {
        List *p,*s;
        if (i==1)
        {
            s=(List*)malloc(sizeof(List));
            s->Data=X;
            s->Next=PtrL;
            return s;
        }
    
        p=FindKth(i-1,PtrL);
        if (p==NULL)
        {
            printf("the insert is invalid");
            return PtrL;
        }else
        {
            s=(List*)malloc(sizeof(List));
            s->Data=X;
            s->Next=p->Next;
            p->Next=s;
            return PtrL;
        }
    
    
    }
    
    List *Delete( int i, List *PtrL )
    {
        List *s,*p;
        if (i==1)
        {
            s=PtrL;
            if (PtrL)
            {
                PtrL=PtrL->Next;
    
            }else
            {
                return NULL;
            }
    
            free(s);
            return PtrL;
        }
    
        p=FindKth(i-1,PtrL);
        if (p==NULL)
        {
            printf("the %d node is null",i-1);
        }else if (p->Next==NULL)
        {
            printf("the %d node is null",i);
        }
    
        s=p->Next;
        p->Next=s->Next;
        free(s);
        return PtrL;
    }
    
    void show(List *PtrL)
    {
        List *P=PtrL;
        while (P)
        {
            printf("%d ",P->Data);
            P=P->Next;
        }
    }
    
    void main()
    {
        List *PtrL=NULL;
        int x;
        int a,b;
        printf("1.insert a node
    ");
        printf("2.delete a node
    ");
        printf("3.query a node
    ");
        printf("4.show all
    ");
        printf("5,delete
    ");
        while (1)
        {
            printf("
    plase enter your order:");
            scanf("%d",&x);
            switch (x)
            {
            case 1:
                printf("please enter what and where do you want to insert:");
                scanf("%d%d",&a,&b);
                PtrL=Insert(a,b,PtrL);
                break;
            case 2:
                printf("plEase enter which one do you want to delete:");
                scanf("%d",&a);
                PtrL=Delete(a,PtrL);
                break;
            case 3:
                printf("PLease enter which one do you want to query:");
                scanf("%d",&a);
                Find(a,PtrL);
                break;
            case 4:
                show(PtrL);
                break;
            case 5:
                exit(0);
                break;
            default:
                break;
            }
        }
    }

    链式存储实现

  • 相关阅读:
    windows 安装 ELK(Elasticsearch,Logstash,kibana)
    NSSM 将程序封装成服务软件
    面试-双向链表
    mySql 事务,游标以及循环
    SQL 事务
    C# Windows 服务
    MVC 中ajax 调用Webservice 或WCF 问题
    js prototype
    计算一个数等于其它数相加的所有可能 如: 5 =1+4 ,1+3+1,2+3,2+2+1,1+1+1+1+1,1+1+1+2
    冒泡排序,选择排序,快速排序
  • 原文地址:https://www.cnblogs.com/jjx2013/p/6223755.html
Copyright © 2011-2022 走看看