线性表之顺序表
/*
使用C语言实现
*/
顺序表有两种实现方式
1、静态数组
#define Size 100;
typedef struct
{
Elemtype data[Size];
int length;
}List;
静态数组实现的方式比较简单,涉及的问题较少,可以参考动态分配的操作过程。
2、动态分配
#define size 20
typedef int Elemtype;//元素类型
typedef struct
{
Elemtype *e;//数据元素
int length;//当前的长度
int listsize;
}List;
以动态分配方式为例
3、操作集
- 初始化操作
int initList( List *L )
{
//长度已固定,可以进行修改
L->e = ( Elemtype* ) malloc ( size * sizeof(int) );
L->length = 0;//当前长度为0
L->listsize = size;//总长度为size
return 0;
}
这里就涉及了C语言动态分配内存的知识,size在开头定义,其实也可以从形参传入,比较自由。
- 插入操作
int insertList( List *L , int n , Elemtype e )
{
//判定是否超过最大长度,也可以进行重分配
if( L->length >= L->listsize )
{
printf("超过最大长度!!!");
return 0;
}
else
{
int i;
//元素依次往后挪
for( i = L->length - 1 ; i >= n - 1 ; i-- )
{
L->e[i+1] = L->e[i];
}
L->e[n-1] = e;
L->length++;//表长加一
return 1;
}
}
这里插入和下一个删除操作都比较重要,插入操作就像是插队,一个人插队,他后面的人就自然往后退。
- 删除操作
int deleteList( List *L , int n )
{
//判定是否超出当前表长
if( n > L->length )
{
printf("并没有此位序的元素");
return 0;
}
int i;
//后面的元素依次往前挪
for( i = n - 1 ; i < L->length ; i++ )
{
L->e[i] = L->e[i+1];
}
L->length--;//表长减一
}
而删除操作相当于刚刚插队的人跑了,所以后面的人都要向前走一步。
- 排序
void sort( List *L )
{//冒泡排序
int i,j;
for( i = 0 ; i < L->length - 1 ; i++ )
{
for( j = 0 ; j < L->length - 1 - i ; j++ )
{
if( L->e[j] > L->e[j+1] )
{
//未采用中间变量的方法
L->e[j] = L->e[j] + L->e[j+1];
L->e[j+1] = L->e[j] - L->e[j+1];
L->e[j] = L->e[j] - L->e[j+1];
}
}
}
}
排序采用的是比较常规的冒泡排序,其中变量交换的方式,如下
int a = 10;
int b = 10;
a = a + b;
b = a - b;
a = a - b;
仔细看看,这样两个就交换过来了,厉害吧!
- 查找
int findList( List *L , Elemtype e )
{
//采用的是二分查找的方法
int mid,l,r;
l = 0; //左端点
r = L->length - 1; //右端点
while( l <= r )
{
mid = ( l + r ) / 2;
if( L->e[mid] == e )
{
return mid + 1;
}
else if( L->e[mid] < e )
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
return 0;
}
- 打印
void printList( List *L )
{
int i;
for( i = 0 ; i < L->length ; i++ )
{
printf("%d ",L->e[i]);
}
}
纸上得来终觉浅,绝知此事要躬行

浙公网安备 33010602011771号