顺序表:简单来说,和一维数组的操作基本类似。这样,就比较容易理解顺序表的各种操作了。
顺序表的存储结构如下:
#define MAXSIZE 100
typedef int ElemType;
typedef struct
{
ElemType elem[MAXSIZE];
int length;
}SeqList;
注意:定义一个顺序表L后,
(1) : 顺序表长:L->length ;
(2) : 数据元素:L->data[1] ~ L->data[length] ,为了与线性表中的元素位序保持一致,不使用数组下标为0的单元.
当然,你可以使用o号单元来存储表长等信息. 接下来,我们看看每个方法的实现函数:
1 - 顺序表的初始化:
void Init_SeqList(SeqList *L)
{
L->length = 0;
}
顺序表初始化就是置空表,仅此而已.
2 - 顺序表的插入:
int Insert_SeqList(SeqList *L,int i,ElemType x)
{
int j;
if(L->length == MAXSIZE -1){
printf("表满\n");
return FALSE;
}
if( i<1 || i>L->length+1){
printf("越界\n");
return FALSE;
}
for(j = L->length; j >= i; j--){
L->elem[j+1]=L->elem[j];
}
L->elem[i] = x;
L->length++;
return TRUE;
}
顺序表的插入操作时,绝对不能越界,或者数据插入的位置不在满足的条件下进行.
3 - 顺序表的删除:
int Pop_SeqList(SeqList *L,int i)
{
int j;
if(i>L->length || i<1){
printf("警告:越界查找!");
return FALSE;
}
for(j=i; j<L->length-1; j++){
L->elem[j]=L->elem[j+1];
}
L->length--;
return TRUE;
}
4 - 顺序表的按值查找:即就是通过键入元素和一维数组元素的比较得到元素在顺序表中的位置.
int Location_SeqList(SeqList *L,ElemType x)
{
int i;
for(i=1; i<=L->length && L->elem[i]!=x; i++);
if(i>L->length) return FALSE;
else return TRUE;
}
顺序表的基本操作还有其他:例如合并,倒序等,在此就不一一列出了,有兴趣可以自己去敲代码哦。现在,我把一个完整的程序,供大家使用:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int ElemType;
typedef struct
{
ElemType elem[MAXSIZE];
int length;
}SeqList;
void Init_SeqList(SeqList *L); //顺序表的初始化.
void Input_SeqList(SeqList *L); //顺序表的数据录入.
int Insert_SeqList(SeqList *L,int i,ElemType x); //顺序表中插入数据.
int Pop_SeqList(SeqList *L,int i); //顺序表中删除num.i元素.
int Location_SeqList(SeqList *L,ElemType x); //顺序表中按值查找.
int main()
{
SeqList *L=(SeqList *)malloc(sizeof(SeqList));
Init_SeqList(L);
Input_SeqList(L);
int i;ElemType x;
printf("\n请输入插入的位置和数据:");
scanf("%d%d",&i,&x);
Insert_SeqList(L,i,x);
printf("\n请输入删除元素的位置:");
scanf("%d",&i);
Pop_SeqList(L,i);
printf("\n请输入要查找的元素的值:");
scanf("%d",&x);
Location_SeqList(L,x);
return 0;
}
void Init_SeqList(SeqList *L)
{
L->length = 0;
}
void Input_SeqList(SeqList *L)
{
printf("请输入顺序表中的元素(按-1结束): ");
int i=1;ElemType x;
scanf("%d",&x);
while(x!=-1){
L->elem[i++]=x;
L->length++;
scanf("%d",&x);
}
}
int Insert_SeqList(SeqList *L,int i,ElemType x)
{
int j;
if(L->length == MAXSIZE -1){
printf("表满\n");
return FALSE;
}
if( i<1 || i>L->length+1){
printf("越界\n");
return FALSE;
}
for(j = L->length; j >= i; j--){
L->elem[j+1]=L->elem[j];
}
L->elem[i] = x;
L->length++;
return TRUE;
}
int Pop_SeqList(SeqList *L,int i)
{
int j;
if(i>L->length || i<1){
printf("警告:越界查找!");
return FALSE;
}
for(j=i; j<L->length-1; j++){
L->elem[j]=L->elem[j+1];
}
L->length--;
return TRUE;
}
int Location_SeqList(SeqList *L,ElemType x)
{
int i;
for(i=1; i<=L->length && L->elem[i]!=x; i++);
if(i>L->length) return FALSE;
else return TRUE;
}
小结:
顺序表的疑惑点大概是:'类似链表结构的数组形式', 但是你只要记住,顺序表就是一维数组,就没什么大不了的了。