顺序表,相关操作
顺序表
顺序表的初始化
void InitList(SqList *&L) {
L = (SqList *)malloc(sizeof(SqList));
L->length = 0;
}
当你在函数中使用 SeqList*& L 作为参数时,你实际上是在传递一个指向 SeqList 指针的引用。这意味着在函数内部对 L 的任何修改(比如让它指向一个新的地址)都会反映到传递给函数的原始指针上。
这在以下情况下很有用:
当你需要初始化一个指针,并让它在函数外部保持有效时。
当你需要在不返回多个值的情况下修改多个变量时。
但是,在纯c语言中一般使用,seqlist**在c++中一般用seqlist*&,可以实现对于该指向seqlist指针本生的改变。
只要高清楚上述问题对于顺序表的操作就会比较简单:
#include <stdio.h>
#include <stdlib.h>
#define max_size 100
//顺序表定义
typedef struct seqlist
{ int length;
int data[max_size];
} seqlist;
//构造空的顺序表
void initList(seqlist **L)
{ L = (seqlist *)malloc(sizeof(seqlist));
L->length = 0;
}
//求顺序表长度
int seqlistlength(seqlist *L)
{ return L->length;
}
//提取顺序表第i个元素
boolean getseqelement(seqlist *L, int i, eletype e) //这里将元素的类型写为eletype e
{ if (i < 0 || i > L->length)
{ return false;
}
if (e == L->data[i - 1])
{ return true;
}
}
//按值查找:在顺序表中从头查找结点值等于给定值 e 的结点,因为是顺序表所以可以直接返回该表的该结点是第几个
int locateseq(seqlist *L, elemtype e) //查找成功概率是(1+n)/2,最好情况:T(n)=O(1) 第一个,最坏情况是T(n)=O(n)
{
int j = 0;
while (j < L->length)
{ if (L->data[j] == e)
{ printf{"该节点的索引位置是%d\n", j};
break;
return j;
}
j++;
}
return 0;
}
//插入某个结点,逆序移至i+1~n+1,且插入元素时该列表长度需要增加
//且这里使用seqlist**实现直接对于顺序表中元素改变,能够直接反应到函数外
boolean seqlist(seqlist*& L,int i,eletype e){
//先判断是否空表
if(L->length0){
return false;
}
//判断i的值是否合理
else if(ilength||i<1||maxsizelength)
return false;
else{
//条件可以,将目标元素后移
for(int j=L->length-1;j>=0;j--){
data[j+1]=data[j];
L->length++;
}
L->data[i]=e;
//在目标元素处实现修改
}
return true;
}//最好情况:插入在n+1 上,移动0次 T(n)=O(1),最坏 T(n)=O(n)
//顺序表中元素的删除
boolean seqdelete(seqlist*&L,int i,elemtype e){//注意此处的i是顺序表中该data的位置,因此
//判断是否是空表,以及i的范围
if(ilength||i<1||L->length==0){
printf(“该顺序表为空!!不能实现删除目标元素”);
return false;
}
else{
for(int j=i-1;jlength;j++){
L->data[j-1]=L->data[j];
}
L->length–;
}
return true;
}
//