线性表练习
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
/*
已知长度为n的线性表A采用顺序存储结构,设计一个时间复杂度为O(n),
空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素
*/
//定义顺序表结构体,一个结构体代表一个线性表
typedef struct
{
int data[MaxSize];
int length;
}Sqlist;
//算法1
/*
算法思想:
把值往前覆盖,不用开辟新的空间保证了空间复杂度为O(1)
*/
void ElemRemove01(Sqlist *&L,int x){
int i,k=0;
for (i = 0; i < L->length; i++)
{
if (L->data[i]!=x)
{
L->data[k]=L->data[i];
k++;
}
}
L->length=k;
}
// 算法2
/*
算法思想:
每次算出x所占的空间数k,把非x元素向前平移k个位置
*/
void ElemRemove02(Sqlist *&L,int x){
int i,k=0;
for (i = 0; i < L->length; i++)
{
if (L->data[i]==x) k++;
else L->data[i-k]=L->data[i];
}
L->length=i-k;
}
int main(){
int i,a[6]={1,2,3,1,2,4};
Sqlist *L;
//申请一个顺序表,顺序表的数据长度是MaxSize=10,另一个是记录当前数据长度的length
/* L=(Sqlist *)malloc(sizeof(Sqlist)); */
void InitList(Sqlist *&L);
InitList(L);
//给线性表赋值
/*
for (i = 0; i < 6; i++)
{
L->data[i]=a[i];
}
L->length=i;
*/
bool ListInsert(Sqlist *&L,int i,int e);
for ( i = 0; i < 6; i++)
{//i是位序
ListInsert(L,i+1,a[i]);
}
//在删除之前遍历线性表
/*
for ( i = 0; i < L->length; i++)
{
printf("%d\t",L->data[i]);
}
*/
void ListTraverse(Sqlist *L);
ListTraverse(L);
printf("\n");
//执行删除x的函数
ElemRemove01(L,1);
//在删除之后遍历线性表
ListTraverse(L);
return 0;
}
//初始化线性表——课本p19方法实现
void InitList(Sqlist *&L){
L=(Sqlist *)malloc(sizeof(Sqlist));
L->length=0;
}
//向线性表插入数据——课本p19方法实现
/*
注:此处的i是位序,不是数组的下标
*/
bool ListInsert(Sqlist *&L,int i,int e){
if (i<1||i>L->length+1) return false;
if (i>MaxSize) return false;
for (int j = L->length; j>=i; j--)
{
L->data[j]=L->data[j-1];
}
L->data[i-1]=e;
L->length++;
return true;
}
//遍历线性表——课本p19代码实现
void ListTraverse(Sqlist *L){
for (int i = 0; i < L->length; i++)
{
printf("%d\t",L->data[i]);
}
}