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

一个线性表采用顺序表表示,设计一个算法,删除其中所有值等于X的元素完整的C语言程序完整的意思是可以直接在visual运行

#include <stdio.h>
#include <stdlib.h>

#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;
}

运行结果

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