删除顺序表中所有值等于x的元素(整体建表法,元素移动法)

//目的:删除顺序表中所有值等于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;
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值