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类型,比较简单而且容易理解。

原文地址:https://www.cnblogs.com/doudoublog/p/5293379.html