线性表之顺序表(C语言实现)

线性表是从数据元素的逻辑结构上定义的.



这种数据元素的逻辑结构的特征如下:

1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素.

2.第一个元素无前驱元素,但有后继元素.

3.最后一个元素有前驱元素,单无后继元素.




可以抽象为如下表述:

元素1 元素2 元素3 元素4 元素5 元素6


然而同一种逻辑结构在内存中却可以有两种存储方式:1.在内存中连续存储的线性表-----顺序表(如数组)

                                 2.在内存中离散存储的线性表-----链表(如单链表,双链表)



对于顺序表有多重操作:初始化,赋值,插入新值,删除值等

下面的用C代码实现顺序表及其一些常用的操作:

  1 #include<stdio.h>
  2 
  3 #define ERROR 0
  4 
  5 #define InitSize 20 //顺序表的初始大小
  6 
  7 typedef int ElemType;
  8 
  9 typedef struct{
 10     ElemType data[InitSize];
 11     int length;
 12 }sqlist;
 13 
 14 //顺序表初始化
 15 void InitList(sqlist *L)
 16 {
 17     L->length=0;
 18     return ;
 19 }
 20 
 21 //获取顺序表的长度
 22 int GetLength(sqlist *L)
 23 {
 24     return L->length;
 25 }
 26 
 27 //顺序表赋值
 28 void GiveValue(sqlist *L)
 29 {
 30     int value;
 31     int i=0;
 32     while(value!=0)
 33     {
 34         printf("Please input %d valueL-------(exit until value equal 0)
",i+1);
 35         scanf("%d",&value);
 36         if(value!=0)
 37         {
 38             L->data[i++]=value;
 39             L->length++;
 40         }
 41     }
 42 }
 43 
 44 
 45 
 46 //获取顺序表某个位置的值
 47 ElemType GetValue(sqlist *L,int i)
 48 {
 49     ElemType e;
 50     if(i>L->length||i<1)
 51         return ERROR;
 52 
 53     int k=0;
 54     for(k=0;k<L->length;k++)
 55     {
 56         if(k==i-1)
 57         e=L->data[k];
 58     }
 59     return e;
 60 }
 61 
 62 //获取顺序表某个值的位置
 63 int GetPos(sqlist *L,ElemType value)
 64 {
 65     int pos;
 66     int judeflag=1;
 67     int i;
 68     for(i=0;i<L->length;i++)
 69     {
 70         if(L->data[i]==value)
 71         {
 72             pos=i+1;
 73             break;
 74         }
 75         judeflag++;
 76     }
 77 
 78     if(judeflag>=L->length)
 79         return ERROR;
 80 
 81     return pos;
 82 }
 83 
 84 //在顺序表指定位置插入新的值
 85 void InsertValue(sqlist *L,int pos,ElemType value)
 86 {
 87     if(pos<1||pos>L->length)
 88         return ERROR;
 89 
 90     int i;
 91     for(i=L->length-1;i>pos-2;i--)
 92     {
 93         L->data[i+1]=L->data[i];
 94     }
 95 
 96     L->data[pos]=value;
 97     L->length++;
 98 }
 99 
100 //在顺序表中指定位置删除值
101 void DeleteValue(sqlist *L,int pos)
102 {
103     if(pos<1||pos>L->length)
104         return ERROR;
105 
106     int i;
107     for(i=pos;i<L->length;i++)
108     {
109         L->data[i-1]=L->data[i];
110     }
111 
112     L->length--;
113 }
114 
115 //显示顺序表
116 void ShowList(sqlist *L)
117 {
118     int i;
119     printf("The List show below:
");
120     for(i=0;i<L->length;i++)
121     {
122         printf("%d ",L->data[i]);
123     }
124 }
125 
126 
127 //主函数
128 int main()
129 {
130     sqlist L;
131     InitList(&L);//初始化顺序表
132     GiveValue(&L);//顺序表赋值
133     ShowList(&L);//显示线性表
134 
135     printf("



");
136     int flag;
137     printf("******************************************************
");
138     printf("*************choose the operation of List*************
");
139     printf("*****************1-指定位置插入值*********************
");
140     printf("*****************2-指定位置删除值*********************
");
141     printf("*****************3-获取顺序表某个值得位置*************
");
142     printf("*****************4-获取顺序表某个位置上的值*********
");
143     printf("*****************5-获取顺序表长度*********************
");
144     printf("*****************0-退出*******************************
");
145     printf("******************************************************
");
146     printf("


");
147 
148     printf("Input the value Flag:
");
149     scanf("%d",&flag);
150 
151     printf("flag=%d
",flag);
152 
153     int pos,value,len;
154     switch(flag){
155     case 1:
156         {
157             printf("Please input the value and position:
");
158             scanf("%d %d",&value,&pos);
159             printf("Insert value=%d in pos=%d
",value,pos+1);
160             InsertValue(&L,pos,value);
161             ShowList(&L);
162             break;
163         }
164     case 2:
165         {
166             printf("Please input the position:
");
167             scanf("%d",&pos);
168             printf("Delete value in pos=%d
",pos);
169             DeleteValue(&L,pos);
170             ShowList(&L);
171             break;
172         }
173     case 3:
174        {
175             printf("Please input the value:
");
176             scanf("%d",&value);
177             pos=GetPos(&L,value);
178             printf("Get value=%d's position is %d
",value,pos);
179             ShowList(&L);
180             break;
181        }
182     case 4:
183         {
184             printf("Please input the position:
");
185             scanf("%d",&pos);
186             value=GetValue(&L,pos);
187             printf("Get value=%d from pos=%d
",value,pos);
188             ShowList(&L);
189             break;
190         }
191     case 5:
192         {
193             len=GetLength(&L);
194             printf("the length of List is %d
",len);
195             ShowList(&L);
196             break;
197         }
198     case 0:
199         printf("you choose to exit
Goodbye!
");
200     }
201 
202     return 0;
203 }


结果图:

原文地址:https://www.cnblogs.com/vpoet/p/4659722.html