//目的:删除顺序表中所有值等于x的元素
#include<stdio.h>
#include<stdlib.h>//包含malloc()和free()
#define MAXSIZE 10
typedef int elemtype;
//创建结构体
typedef struct {
int*data; //若int data[MAXSIZE];
int length;
}sqlist;
//创建顺序表
void createlist(sqlist*L) {
L->data= (int*)malloc(sizeof(elemtype) * MAXSIZE);
//若struct中是int data[MAXSIZE];
//上式替换为:
// int*p; p=(sqlist*)malloc(sizeof(sqlist));
}
//
//法二:静态定义(即利用数组)
//#include<stdio.h>
//#define MAXSIZE 10
//typedef int elemtype;
//typedef struct {
// int data[MAXSIZE];
// int length;
//}sqlist;//已经创建好了顺序表
//
//初始化顺序表
void initlist(sqlist*L,int a[],int n) {
int i = 0;
for (; i < n; i++)
L->data[i] = a[i];
L->length = n;
}
//输出顺序表
void displist(sqlist* L) {
int i = 0;
for (; i < L->length; i++)
printf("%d ", L->data[i]);
printf("\n");
}
//删除指定元素,有两种方法
void deletelist(sqlist* L, int a) {
/*法1整体建表法,在原数组中重头开始重新存储,注意并没有创建新数组
利用L->length*/
int i = 0,k=0;
while (i < L->length) {
if (L->data[i] != a) {
L->data[k] = L->data[i];
k++;
}
i++;
}
L->length = k+1;
/*法2元素移动法,累计统计每个不为x的元素前面共有多少个等于x的元素,
再将每个不为x的元素向前移动相应个位置
比如;1949101 x=9
第一个1前0个9,不移动
4前1个9,向前移动1位
0前2个9,向前移动2位
int i=0,k=0;
while(i<L->length){
if(L->data[i]==a)
k++;
else
L->data[i-k]=L->data[i];
i++;
}
L->length=i-k;
*/
}
//销毁顺序表
void destroylist(sqlist* L) {
free(L);
}
int main() {
int a[MAXSIZE] = {1,9,4,9,1,0,1};
sqlist L;
int i = 0;
createlist(&L);
initlist(&L,a,7);
displist(&L);
deletelist(&L,9);
displist(&L);
destroylist(&L);/*实际上只有创建,初始化,插入,删除和销毁需要直接引用符号& 。
但displist不用&时我的编译器报错。可以在创建,初始化,插入,删除和销毁时直接使用&,
比如:void destroylist(sqlist*&L) {
free(L);}
那么在main()中调用destroylist时,displist(&L);变为displist(L);
*/
return 0;
}