线性表的顺序表示——顺序表
2015-06-09 21:08
295 查看
顺序表示(存储):
指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称其为顺序表。
在实现的过程中一般用数组来表述顺序存储。表示如下
#define MAXSIZE 100
typedef int Elemtype;
typedef struct sqlist
{
Elemtype a[MAXSIZE];
int length;
}sqlist;
1,顺序表的初始化
顺序表的初始化是指把表的长度设为0,通过控制结构体里的length的值来实现,代码如下:
void initial(sqlist* L)
//这里要注意参数传递的方式是按指针传后按引用传
{
L->length = 0;
}
2,顺序表的创建
顺序表的创建首先是给结构体里的length赋上一个值,即顺序表的长度。然后在依次输入表中的各个数据。代码如下:
void creat(sqlist* L)//同样是按指针或引用传,另外参数传递的方式要与后面调用结构体里的元素的形
式一致,指针L->(),引用L.()
{
int n,i;
printf("请输入表长:");
scanf("%d",&n);
L->length = n;
for(i = 0;i < L->length;i++)
{
printf("请输入第%d个元素:",i+1);
scanf("%d",&L->a[i]);
}
}
3,顺序表的插入
顺序表的插入是指在已经给出的顺序表上插入一个元素。在插入元素时有两种插入方式:
一种是插入到顺序表中的第几个元素之前,这时需要表长加一且从该表中最后一个元素开始到该元素,每个元素往后移动一位。(a[i]
= a[i+1],从最后一个开始的原因是避免元素被重复赋值),再要插入的数据赋给指定位置的元素;另外也要注意偏移量对插入操作的影响。代码如下:
void
insert_1(sqlist* L)
{
int i,k,num;
printf("请输入要插入的位置:");
scanf("%d",&k);
printf("请输入要插入的元素:");
scanf("%d",&num);
L->length++;
for(i = L->length-1;i >= k-1;i--)//注意偏移量的影响
{
L->a[i+1] = L->a[i];
}
L->a[k-1] = num;
}
另一种插入操作是插入到指定的元素前(前提是顺序表中有该元素)。方法是先统计该元素的下标,再按第一种方法进行插入。代码如下:
void insert_2(sqlist* L)
{
int a,num,k,i;
printf("请输入要插在哪个元素前面:");
scanf("%d",&a);
for(i = 0;i < L->length;i++)
{
if(a == L->a[i])
{
k = i;
}
}
printf("请输入要插入的元素:");
scanf("%d",&num);
L->length++;
for(i = L->length-1;i >= k;i--)//两种方法在处理偏移的方法略有不同
{
L->a[i+1] = L->a[i];
}
L->a[k] = num;
}
4,顺序表的删除
在顺序表中删除指定的元素,也有两种方法,按下标删除或者按指定值删除。操作与插入类似,只是数据移动的方向相反,同样要注意偏移量。代码如下:
方法一:
void
delete_1(sqlist* L)
{
int k,i;
printf("请输入删除元素的位置:");
scanf("%d",&k);
for(i = k-1;i < L->length-1;i++)
{
L->a[i] = L->a[i+1];
}
L->length--;
}
方法二:
void delete_2(sqlist* L)
{
int num,k,i;
printf("请输入要删除的元素:");
scanf("%d",&num);
for(i = 0;i < L->length;i++)
{
if(L->a[i] == num)
{
k = i;
}
}
for(i = k;i < L->length-1;i++)
{
L->a[i] = L->a[i+1];
}
L->length--;
}
5,顺序表的查找
查找操作比较简单,代码如下:
void
locate(sqlist L)
{
int num,i;
printf("请输入要查找的元素:");
scanf("%d",&num);
for(i = 0;i < L.length;i++)
{
if(L.a[i] == num)
{
printf("你查找的元素为:%d\n",L.a[i]);
break;
}
}
}
6,顺序表的输出
代码如下:
void
output(sqlist L)
{
int i;
for(i = 0;i < L.length;i++)
{
printf("NO.%d : %d\n",i+1,L.a[i]);
}
}
最后附上能够运行的代码:
指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称其为顺序表。
在实现的过程中一般用数组来表述顺序存储。表示如下
#define MAXSIZE 100
typedef int Elemtype;
typedef struct sqlist
{
Elemtype a[MAXSIZE];
int length;
}sqlist;
1,顺序表的初始化
顺序表的初始化是指把表的长度设为0,通过控制结构体里的length的值来实现,代码如下:
void initial(sqlist* L)
//这里要注意参数传递的方式是按指针传后按引用传
{
L->length = 0;
}
2,顺序表的创建
顺序表的创建首先是给结构体里的length赋上一个值,即顺序表的长度。然后在依次输入表中的各个数据。代码如下:
void creat(sqlist* L)//同样是按指针或引用传,另外参数传递的方式要与后面调用结构体里的元素的形
式一致,指针L->(),引用L.()
{
int n,i;
printf("请输入表长:");
scanf("%d",&n);
L->length = n;
for(i = 0;i < L->length;i++)
{
printf("请输入第%d个元素:",i+1);
scanf("%d",&L->a[i]);
}
}
3,顺序表的插入
顺序表的插入是指在已经给出的顺序表上插入一个元素。在插入元素时有两种插入方式:
一种是插入到顺序表中的第几个元素之前,这时需要表长加一且从该表中最后一个元素开始到该元素,每个元素往后移动一位。(a[i]
= a[i+1],从最后一个开始的原因是避免元素被重复赋值),再要插入的数据赋给指定位置的元素;另外也要注意偏移量对插入操作的影响。代码如下:
void
insert_1(sqlist* L)
{
int i,k,num;
printf("请输入要插入的位置:");
scanf("%d",&k);
printf("请输入要插入的元素:");
scanf("%d",&num);
L->length++;
for(i = L->length-1;i >= k-1;i--)//注意偏移量的影响
{
L->a[i+1] = L->a[i];
}
L->a[k-1] = num;
}
另一种插入操作是插入到指定的元素前(前提是顺序表中有该元素)。方法是先统计该元素的下标,再按第一种方法进行插入。代码如下:
void insert_2(sqlist* L)
{
int a,num,k,i;
printf("请输入要插在哪个元素前面:");
scanf("%d",&a);
for(i = 0;i < L->length;i++)
{
if(a == L->a[i])
{
k = i;
}
}
printf("请输入要插入的元素:");
scanf("%d",&num);
L->length++;
for(i = L->length-1;i >= k;i--)//两种方法在处理偏移的方法略有不同
{
L->a[i+1] = L->a[i];
}
L->a[k] = num;
}
4,顺序表的删除
在顺序表中删除指定的元素,也有两种方法,按下标删除或者按指定值删除。操作与插入类似,只是数据移动的方向相反,同样要注意偏移量。代码如下:
方法一:
void
delete_1(sqlist* L)
{
int k,i;
printf("请输入删除元素的位置:");
scanf("%d",&k);
for(i = k-1;i < L->length-1;i++)
{
L->a[i] = L->a[i+1];
}
L->length--;
}
方法二:
void delete_2(sqlist* L)
{
int num,k,i;
printf("请输入要删除的元素:");
scanf("%d",&num);
for(i = 0;i < L->length;i++)
{
if(L->a[i] == num)
{
k = i;
}
}
for(i = k;i < L->length-1;i++)
{
L->a[i] = L->a[i+1];
}
L->length--;
}
5,顺序表的查找
查找操作比较简单,代码如下:
void
locate(sqlist L)
{
int num,i;
printf("请输入要查找的元素:");
scanf("%d",&num);
for(i = 0;i < L.length;i++)
{
if(L.a[i] == num)
{
printf("你查找的元素为:%d\n",L.a[i]);
break;
}
}
}
6,顺序表的输出
代码如下:
void
output(sqlist L)
{
int i;
for(i = 0;i < L.length;i++)
{
printf("NO.%d : %d\n",i+1,L.a[i]);
}
}
最后附上能够运行的代码:
#include<stdio.h> #define MAXSIZE 100 typedef int Elemtype; typedef struct { Elemtype a[MAXSIZE]; int length; }sqlist; void initial(sqlist* L) { L->length = 0; } void creat(sqlist* L) { int n,i; printf("请输入表长:"); scanf("%d",&n); L->length = n; for(i = 0;i < L->length;i++) { printf("请输入第%d个元素:",i+1); scanf("%d",&L->a[i]); } } void output(sqlist L) { int i; for(i = 0;i < L.length;i++) { printf("NO.%d : %d\n",i+1,L.a[i]); } } void insert_1(sqlist* L) { int i,k,num; printf("请输入要插入的位置:"); scanf("%d",&k); printf("请输入要插入的元素:"); scanf("%d",&num); L->length++; for(i = L->length-1;i >= k-1;i--) { L->a[i+1] = L->a[i]; } L->a[k-1] = num; } void insert_2(sqlist* L) { int a,num,k,i; printf("请输入要插在哪个元素前面:"); scanf("%d",&a); for(i = 0;i < L->length;i++) { if(a == L->a[i]) { k = i; } } printf("请输入要插入的元素:"); scanf("%d",&num); L->length++; for(i = L->length-1;i >= k;i--) { L->a[i+1] = L->a[i]; } L->a[k] = num; } void delete_1(sqlist* L) { int k,i; printf("请输入删除元素的位置:"); scanf("%d",&k); for(i = k-1;i < L->length-1;i++) { L->a[i] = L->a[i+1]; } L->length--; } void delete_2(sqlist* L) { int num,k,i; printf("请输入要删除的元素:"); scanf("%d",&num); for(i = 0;i < L->length;i++) { if(L->a[i] == num) { k = i; } } for(i = k;i < L->length-1;i++) { L->a[i] = L->a[i+1]; } L->length--; } void locate(sqlist L) { int num,i; printf("请输入要查找的元素:"); scanf("%d",&num); for(i = 0;i < L.length;i++) { if(L.a[i] == num) { printf("你查找的元素为:%d\n",L.a[i]); break; } } } int main() { sqlist L; initial(&L); creat(&L);output(L); insert_1(&L);output(L); insert_2(&L);output(L); delete_1(&L);output(L); delete_2(&L);output(L); locate(L); return 0; } |
相关文章推荐
- 隐马尔科夫七(二)
- sina33打开spi0dev0.0、spi1dev1.0的步骤.txt(全志a33下生成设备节点/dev/spi0dev0.0、/dev/spi1dev1.0)
- URAL 1792. Hamming Code (枚举)
- 我的奋斗之我的构想
- 第十四周【项目1 - 小玩文件】
- Java增强循环
- POJ3522 - Slim Span (Japan 2007)
- IOS常用正则表达式
- golang入门教程(一) 安装和环境搭建
- UnitManager API
- svn同步报错—— This client is too old to work with working copy
- leetcode[30]:Flatten Binary Tree to Linked List
- 虚拟机上网
- 2015届华为校园招聘机试题 (3)java实现
- 【leetcode】Multiply Strings(middle)
- TiedStateAcousticModel API 声学模型
- 算法导论第七章总结:快速排序
- C++ Primer 学习笔记_40_STL实践与分析(14)--概要、先来看看算法【上】
- 顺时针打印矩阵
- CSS Selectors