线性表用c语言程序表示,一个线性表采用顺序表表示,设计一个算法,删除其中所有值等于X的元素完整的C语言程序...

这段代码展示了如何在C语言中实现顺序线性表的基本操作,包括初始化、插入元素、删除元素和输出线性表的内容。程序首先创建一个顺序表,然后插入多个元素,接着根据给定的值删除元素,并最终输出删除后的线性表内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include 

#include 

#define ElemType int

#define Status int

#define OVERFLOW -1

#define ERROR 0

#define OK 1

/* 线性表的动态分配顺序存储结构 */

#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量 */

#define LIST_INCREMENT 2 /* 线性表存储空间的分配增量 */

typedef struct {

ElemType *elem; /* 存储空间基址 */

int length; /* 当前长度 */

int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */

} SqList;

/* 操作结果:构造一个空的顺序线性表L */

void InitList(SqList *L) {

L->elem=malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!L->elem)

exit(OVERFLOW); /* 存储分配失败 */

L->length=0; /* 空表长度为0 */

L->listsize=LIST_INIT_SIZE; /* 初始存储容量 */

}

/* 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L */

void DestroyList(SqList *L) {

free(L->elem);

L->elem=NULL;

L->length=0;

L->listsize=0;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */

/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */

Status ListInsert(SqList *L,int i,ElemType e) {

ElemType *newbase,*q,*p;

if(i<1||i>L->length+1) /* i值不合法 */

return ERROR;

if(L->length>=L->listsize) { /* 当前存储空间已满,增加分配 */

newbase=realloc(L->elem,(L->listsize+LIST_INCREMENT)*sizeof(ElemType));

if(!newbase)

exit(OVERFLOW); /* 存储分配失败 */

L->elem=newbase; /* 新基址 */

L->listsize+=LIST_INCREMENT; /* 增加存储容量 */

}

q=L->elem+i-1; /* q为插入位置 */

for(p=L->elem+L->length-1;p>=q;--p) /* 插入位置及之后的元素右移 */

*(p+1)=*p;

*q=e; /* 插入e */

++L->length; /* 表长增1 */

return OK;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */

/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */

Status ListDelete(SqList *L,int i,ElemType *e) {

ElemType *p,*q;

if(i<1||i>L->length) /* i值不合法 */

return ERROR;

p=L->elem+i-1; /* p为被删除元素的位置 */

*e=*p; /* 被删除元素的值赋给e */

q=L->elem+L->length-1; /* 表尾元素的位置 */

for(++p;p<=q;++p) /* 被删除元素之后的元素左移 */

*(p-1)=*p;

L->length--; /* 表长减1 */

return OK;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */

/* 操作结果:打印顺序线性表所有元素 */

void OutputList(SqList *L) {

ElemType *p;

int i;

p=L->elem; /* p的初值为第1个元素的存储位置 */

for (i=1; i<=L->length; i++, p++)

printf ("%d\t", *p);

putchar ('\n');

}

int main () {

SqList L; /*定义顺序表*/

ElemType *p,e;

int i;

ElemType X=5; /*程序欲删除元素值为X的元素*/

InitList (&L); /*初始化顺序表*/

/*插入若干元素*/

ListInsert (&L,1,1);

ListInsert (&L,1,2);

ListInsert (&L,3,5);

ListInsert (&L,4,3);

ListInsert (&L,5,5);

ListInsert (&L,6,4);

printf ("初始顺序线性表内容为:\n");

OutputList (&L);

putchar ('\n');

/*删除元素值为x的元素*/

p=L.elem; /* p的初值为第1个元素的存储位置 */

for (i=1; i<=L.length; i++, p++) {

if (*p == X) {

ListDelete (&L,i,&e);

printf ("第%d个元素,其值为%d,已删除!\n", i, e);

}

}

putchar ('\n');

printf ("删除元素值为x的元素之后顺序线性表内容为:\n");

OutputList (&L);

putchar ('\n');

getch ();

return 0;

}

运行结果

4b69afed79d7647348ffdb3344ad7a4b.png

温馨提示:答案为网友推荐,仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值