zoukankan      html  css  js  c++  java
  • C:数据结构与算法之顺序表

    顺序表作为数据结构的开端,说明这里面很多基础要学,初学者一开始都会混淆,今天我们来一步一步来建立一个完整的顺序表,可以任我们控制的顺序表,首先先定义一个顺序表

    复制代码
    /* Note:Your choice is C IDE */
    #include "stdio.h"
    #define MAXSIZE 100
    typedef struct /*结构体的格式*/
    {
        int data[MAXSIZE];
        int last;
    }Seqlist; /*顺序表的名称*/
    复制代码

    定义在主函数定义一个指向这个顺序表的指针:Seqlist L*;然后定义一个函数来初始化这个顺序表,初始化即构造一个空表,将L设为指针参数,动态分配空间。初始化函数代码如下:

    复制代码
    Seqlist *init()
    {
        Seqlist *L;
        L=(Seqlist *)malloc(sizeof(Seqlist));
        L->last=-1;
        return L;
    }
    复制代码

    一切预备工作已经做好了,这个last表示此表中最后一个的位置,L->data[0]~L->data[L->last]就是所有数据的长度,现在要创建一个可以手动输入你想要的数据到顺序表里面的函数,设这个函数名为intsert();

    复制代码
    intsert(Seqlist *L,int i,int x)
    {
        int j;
        for(j=L->last;j>=i-1;j++)
        L->data[j+1]=L->data[j];
        L->data[i-1]=x;
        L->last++;
        return 1;
    }
    复制代码

    如果你想要输入8个数据到顺序表,与主函数联合起来,代码如下:

    复制代码
    /* Note:Your choice is C IDE */
    #include "stdio.h"
    #define MAXSIZE 100
    typedef struct
    {
        int data[MAXSIZE];
        int last;
    }Seqlist;
    Seqlist *init();
    insert(Seqlist *L,int i,int x);
    main()
    {
        int x,i;
        Seqlist *L;
        L=init();
        for(i=1;i<=8;i++)
        {
        scanf("%d",&x);
        insert(L,i,x);
        }
            printf("写入成功!");
    }
    insert(Seqlist *L,int i,int x)
    {
        int j;
        for(j=L->last;j>=i-1;j++)
        L->data[j+1]=L->data[j];
        L->data[i-1]=x;
        L->last++;
    
    }
    Seqlist *init()
    {
        Seqlist *L;
        L=(Seqlist *)malloc(sizeof(Seqlist));
        L->last=-1;
        return L;
    }
    复制代码

    我们可以输入,但是不知道有没有输入成功,可以写个输出的函数:

    复制代码
    void print(Seqlist *L)/*输出函数*/
    {
        int i;
        if(L->last==-1)
        printf("null!!");
        else
        {
        for(i=0;i<=L->last;i++)
        printf("| %d",L->data[i]);
    }
    复制代码

    同样的还有删除顺序表任意元素的函数:

    复制代码
    int Delete(Seqlist *L,int i)
    {
        int j;
        if(i<1||i>L->last+1)
        {
            printf("不存在第i个元素!");
            return 0;
        }
        for(j=i;j<=L->last;j++)
        L->data[j-1]=L->data[j];
        L->last--;
    }
    复制代码

    查看任意元素的位置并返回位置:

    复制代码
    Location(Seqlist *L,int x)
    {
        int i=0;
        while(i<=L->last&&L->data[i]!=x)
            i++;
            if(i++>L->last)
            return -1;
            else
            return i;
    }
    复制代码

    选择在哪个位置增加函数并不破坏顺序表:

    复制代码
    add(Seqlist *L,int x,int i)
    {
        int j;
        if(i>L->last+1)
        printf("超出范围!");
        else
        for(j=L->last;j>=i-1;j--)
        L->data[j+1]=L->data[j];
        L->data[i-1]=x;
    }
    复制代码

    在某个位置修改元素,当然你得输入你想修改的位置和新元素:

    int change(Seqlist *L,int a,int b)
    {
        L->data[a-1]=b;
    }

    这么多函数连用在一起就是一个完整的顺序表了,这里我用一个比较直观的方式体现出顺序表,把它设计成一个这样:,并且当你按1你就可以输入你想增加的元素,按5就可以打印出顺序表。

    代码如下:

    复制代码
      1 /* Note:Your choice is C IDE */
      2 #include "stdio.h"
      3 #define MAXSIZE 100
      4 typedef struct
      5 {
      6     int data[MAXSIZE];
      7     int last;
      8 }Seqlist;
      9 Seqlist *init();
     10 void print(Seqlist *L);
     11 insert(Seqlist *L,int i,int x);
     12 int Delete(Seqlist *L,int i);
     13 void showMainWindows();
     14 int change(Seqlist *L,int a,int b);
     15 Location(Seqlist *L,int x);
     16 add(Seqlist *L,int x,int i);
     17 function(int x);
     18 main()
     19 {
     20     int x,i;
     21     Seqlist *L;
     22     L=init();
     23     printf("首先你得先输入8个数据!
    ");
     24     for(i=1;i<9;i++)
     25     {
     26     scanf("%d",&x);
     27     insert(L,i,x);
     28     }
     29     system("cls");
     30     printf("写入成功,请继续使用顺序表!");
     31     showMainWindows();
     32     
     33     while(1)
     34     {
     35     int num;
     36     scanf("%d",&num);
     37     function(num);
     38     if(num==1)
     39     {
     40     int a,b;
     41     scanf("%d,%d",&a,&b);
     42     add(L,a,b);
     43     }
     44     else
     45     if(num==2)
     46     {
     47         int a,b;
     48         scanf("%d,%d",&a,&b);
     49         change(L,a,b);
     50     }
     51     else
     52     if(num==3)
     53     {
     54      int de;
     55     scanf("%d",&de);
     56     Delete(L,de);
     57     }
     58     else
     59     if(num==4)
     60     {
     61         int y;
     62         scanf("%d",&y);
     63      printf("此元素在第%d",Location(L,y));
     64     }
     65     else
     66       if(num==5)
     67     print(L);
     68     if(num==0)
     69     break;
     70         }
     71 
     72 }
     73 Seqlist *init()
     74 {
     75     Seqlist *L;
     76     L=(Seqlist *)malloc(sizeof(Seqlist));
     77     L->last=-1;
     78     return L;
     79 }
     80 void print(Seqlist *L)
     81 {
     82     int i;
     83     if(L->last==-1)
     84     printf("null!!");
     85     else
     86     {
     87     for(i=0;i<=L->last;i++)
     88     printf("| %d  ",L->data[i]);
     89     printf("请继续输入0~5之间的数:
    ");
     90     }
     91 }
     92 insert(Seqlist *L,int i,int x)
     93 {
     94     int j;
     95     for(j=L->last;j>=i-1;j++)
     96     L->data[j+1]=L->data[j];
     97     L->data[i-1]=x;
     98     L->last++;
     99         
    100 }
    101 int Delete(Seqlist *L,int i)
    102 {
    103     int j;
    104     if(i<1||i>L->last+1)
    105     {
    106         printf("不存在第i个元素!
    ");
    107         return 0;
    108     }
    109     for(j=i;j<=L->last;j++)
    110     L->data[j-1]=L->data[j];
    111     L->last--;
    112     printf("删除成功,查看请按5!
    ");
    113 }
    114 void showMainWindows()
    115 {
    116     printf("
    
    	+------------------------------------------------------+
    ");
    117     printf("	|                    顺序表练习                        |
    ");
    118     printf("	+------------------------------------------------------+
    ");
    119     printf("	|------------------- 1.增    加 -----------------------|
    ");
    120     printf("	|------------------- 2.修    改 -----------------------|
    ");
    121     printf("	|------------------- 3.删    除 -----------------------|
    ");
    122     printf("	|------------------- 4.查    找 -----------------------|
    ");
    123     printf("	|------------------- 5.打 印 表-----------------------|
    ");
    124     printf("	|------------------- 0.退出系统 -----------------------|
    ");
    125     printf("	+------------------------------------------------------+
    ");
    126     printf("	|               请输入您的选择(0-5)                    |
    ");
    127     printf("	+------------------------------------------------------+
    ");
    128     printf("
    
    ");
    129 }
    130 int change(Seqlist *L,int a,int b)
    131 {
    132     L->data[a-1]=b;
    133     printf("修改成功,查看请按5!
    ");
    134 }
    135 Location(Seqlist *L,int x)
    136 {
    137     int i=0;
    138     while(i<=L->last&&L->data[i]!=x)
    139         i++;
    140         if(i++>L->last)
    141         return -1;
    142         else
    143         return i;
    144 }
    145 add(Seqlist *L,int x,int i)
    146 {
    147     int j;
    148     if(i>L->last+1)
    149     printf("超出范围!或格式不对!请你继续输入0~5之间的数!
    ");
    150     else
    151     for(j=L->last;j>=i-1;j--)
    152     L->data[j+1]=L->data[j];
    153     L->data[i-1]=x;
    154     }
    155 function(int x)
    156 {
    157     switch(x)
    158     {
    159         case 1:printf("请输入你要增加的元素和位置:");
    160         break;
    161         case 2:printf("请输入你要修改元素的位置和新元素:");
    162         break;
    163         case 3:printf("请输入你要删除的元素位置:");
    164         break;
    165         case 4:printf("请输入你要查找的元素并返回其位置:");
    166         break;
    167         case 5:printf("     打印出顺序表:");
    168     }
    169 }
    复制代码

    这就是我自己写的一个比较完整的顺序表,当然这里面都是int类型,比较简单而且容易理解。

  • 相关阅读:
    快速排序
    归并排序
    堆排序
    通过先序和中序创建二叉树
    插入排序
    二叉排序树
    九宫重排
    字符串匹配 sunday算法
    傻逼数学题(math)
    最近点对学习笔记
  • 原文地址:https://www.cnblogs.com/doudoublog/p/5293379.html
Copyright © 2011-2022 走看看