《数据结构》 顺序表常用操作代码集合
Ps:每段代码中,添加了署名Solo的是博主自己写的,其余来自课本或者老师。
//定义线性表的存储结构
#define MAXSIZE 100
typedef struct
{
ElemType elem[MAXSIZE]; //ElemType自定义
int last;
} SeqList;
//线性表按查找内容运算 Locate(L,e)函数
int Locate(SeqList L, ElemType e)
{
i = 0;
while((i <= L.last) && (L.elem[i] != e))
i++;
if(i <= L.last) return(i + 1);
else return(-1);
}
//线性表的插入操作
#define OK 1
#define ERROR 0
int InList(Seqlist *L, int i, ElemType e)
{
int k;
if(i < 1 || i > L->last+2)
{
printf("插入位置i不合法");
return ERROR;
}
if(L->last >= MAXSIZE - 1)
{
printf("表已满,无法插入");
return ERROR;
}
for(k = L->last; k >= i-1; k--)
L->elem[k+1] = L->elem[k];
L->elem[i-1] = e;
L->last++;
return OK;
}
//线性表的删除操作
int DelList(SeqList *L, int i, ElemType *e)
{
int k;
if(i < 1 || i > L->last+1)
{
printf("删除位置不合法");
return ERROR;
}
*e = L->elem[i-1];
for(k = i; i <= L->last; k++)
L->elem[k-1] = elem[k];
L->last--;
return OK;
}
//线性表原地逆置
int SListRev(SeqList *L)
{
int i;
ElemType t;
for(i=0; i<L->last/2; i++)
{
t = a[i]; a[i] = a[n-i-1]; a[n-i-1] = t;
}
return Ok;
}
//线性表的合并运算1
void mergeList(SeqList *LA, Seqlist *LB, Seqlist *LC)
{
int i,j,k;
i=0; j=0; k=0;
while(i <= LA->last && j <= LB->last)
if(LA->elem[i] <= LB->elem[j])
{
LC->elem[k] = LA->elem[i];
i++; k++;
}
else{
LC->elem[k] = LB->elem[i];
j++; k++;
}
while(i <= LA->last)
{
LC->elem[k] = LA->elem[i];
i++; k++;
}
while(j <= LB->last)
{
LC->elem[k] = LA->elem[j];
j++; k++;
}
LC->last = LA->last + LB->last + 1;
}
//线性表的合并运算2——Solo
void mergeList(SeqList *LA, Seqlist *LB, Seqlist *LC)
{
int i,j,k;
i=0; j=0; k=0;
while(i <= LA->last || j <= LB->last)
if(LA->elem[i] <= LB->elem[i] || (i <= LA->last && j > LB->last )
{
LC->elem[k] = LA->elem[i];
i++; k++;
}
if(LA->elem[i] > LB->elem[j] || (i > LA->last && j <= LB->last))
{
LC->elem[k] = LB->elem[i];
j++; k++;
}
}
/*删除非递减顺序表L中所有值相等元素——Solo*/
//①若相等的值只有一个,为e,只有该种情况才能满足《数据结构》课本习题的要求
void Delsame(Seqlist *L e)
{
int i,j;
for(i=0,j=0; i<L->last; i++)
if(L->elem[i] != e) { L->elem[j] = L->elem[i]; j++; }
L->last = j+1;
}
//②若相等的值有很多,且不确定 两种方法
void Delmulsame(Seqlist *L)
{
int i,j,k;
for(i=0; i<L->last; i++)
for(j=1; j<L->last; j++)
{
if(L->elem[i] = L->elem[j])
for(k=j; j<L->last; k++)
{
L->elem[k] = L->elem[k+1];
L->last--;
}
}
}
void Delmulsame(Seqlist *L)
{
int i,j,k,t;
for(i=0; i<L->last-1; i++)
{
for(k=i, j=i+1; j<n; j--) //冒泡法排序
if(a[j] <a[k]) k = j;
if(k != i)
{ t = a[i]; a[i] = a[k]; a[k] = t; }
}
/* for(i=0; i<L->last-1; i++) //这段被注释掉了,是选择法排序
for(j=L-last-1; j>=i; j--)
if(a[j] > a[j+1])
{ a[j] = t; a[j] = a[j+1]; a[j+1] = a[j]; } */
for(i=0; i<L->last; i++)
{
if(L->elem[i] = L->elem[i+1])
{
for(k=i; k<L->last; k++)
{
L->elem[k] = L->elem[k+1];
k--;
L->last--;
}
}
}
}
zhihu:Solo | weibo@从流域到海域