创建空顺序线性表——C语言

创建空顺序线性表——C语言

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

/*此处是顺序线性表数据结构定义*/
typedef int DataType; //定义数据类型
struct seqList { //定义线性表结构体
  int MAXNUM; //用于记录顺序线性表中能存放的最大元素个数的 整型 MAXNUM   
  int curNum; //用于存放顺序线性表中数据元素的个数  整型 curNum
  DataType * element; //用于存放顺序线性表数据元素的连续空间的起始地址 指针类型
};

typedef struct seqList * PseqList; //定义线性表指针类型,方便后序的函数传递参数

//第一关:创建空的顺序线性表
PseqList createNullList_seq(int m) { 
  //输入参数为能存放的最大元素个数
  if (m == 0) { //若m=0,则返回NULL 
    return NULL;
  }
  PseqList List = (PseqList)malloc(sizeof(struct seqList)); //申请线性表的动态内存空间
  List->MAXNUM = m; //初始化最大元素个数
  List->curNum = 0; //初始化当前元素个数
  List->element = (DataType*)malloc(sizeof(DataType)*m); //申请线性表元素的动态内存空间
  return List;
}

//第二关:判断顺序线性表是否已满
int isFullList_seq(PseqList L) {
  if(L->curNum ==L-> MAXNUM){ //当当前元素个数等于最大元素个数时,线性表已满
    return 1;
  }else{
    return 0;
  }
}

//在线性表L中下标为p的位置插入数据元素x
int insertP_seq(PseqList L, int p, int x) { 
  //如果线性表满了,还需输"list is full"的提示
  //如果插入位置非法,需输出提示"position is illegel" 
  if(isFullList_seq(L)==1){ //判断线性表是否已满
    printf("list is full\n");
    return 0;
  }
  if(p<0||p>L->curNum){ //插入位置非法
    printf("position is illegel\n");
    return 0;
  }
  for(int i=L->curNum;i>p;i--){ //将插入位置后的所有元素往后移动一位
    L->element[i] = L -> element[i-1];
  }
  L -> element[p] = x; //插入新元素
  L -> curNum++; //当前元素个数加一
  return 1;
}

//在线性表L中下标为p的位置的前面插入数据元素x
int insertPre_seq(PseqList L, int p, int x) { 
  // 直接调用insertP函数实现即可    
  return insertP_seq(L, p-1, x);
}

//在线性表L中下标为p的位置的后面插入数据元素x
int insertPost_seq(PseqList L, int p, int x) { 
  //直接调用insertP函数实现即可    
  return insertP_seq(L, p, x);
}

//逐个输出线性表的元素,相邻的两个数据元素之间以一个空格为分隔符隔开
void printList_seq(PseqList L) { 
  for(int i = 0; i < L->curNum; i++) {
    printf("%d ", L->element[i]);
  }
  printf("\n");
}

//第三关:销毁线性表
int destroyList_seq(PseqList L) {
  //返回值为销毁的线性表中现有数据元素的个数,若待销毁的线性表不存在,则返回0
  if(L == NULL) return 0;
  int num = L->curNum; //记录当前元素个数
  free(L->element); //释放动态内存空间
  free(L);
  return num;
}

//第四关:查找元素
//在顺序表L中查找给定值x首次出现的位置,若不存在给定值,则返回-1
int locate_seq(PseqList L, int x) { 
  for(int i = 0; i < L->curNum; i++) {
    if(L->element[i] == x) { //找到给定值
      return i;
    }
  }
  return -1; //未找到
}

//在顺序表L中查找指定位置pos处的数据元素,若位置非法,则返回第0个数据元素
DataType locatePos_seq(PseqList L, int pos) { 
  if(pos < 0 || pos >= L->curNum) { //位置非法
    return L->element[0]; //返回第0个数据元素
  }
  return L->element[pos];
}

//第五关:删除元素
//在顺序表L中删除与下标pos处的数据元素,若pos非法,则返回-1;否则返回1
int deletePos_seq(PseqList L, int pos) { 
  if(pos < 0 || pos >= L->curNum) { //下标非法
    return -1;
  }
  for(int i = pos; i < L->curNum-1; i++) { //将删除位置后的所有元素往前移动一位
    L->element[i] = L->element[i+1];
  }
  L->curNum--; //当前元素个数减一
  return 1;
}

//在顺序表L中删除与参数x值相同的数据元素,返回删除数据元素的个数
int delete_seq(PseqList L, int x) { 
  int cnt = 0; //记录删除元素的个数
  for(int i = 0; i < L->curNum; i++) {
    if(L->element[i] == x) { //找到匹配的元素
      deletePos_seq(L, i); //删除指定位置的元素
      i--; //注意此处需要将i回退1,因为删除元素后后面的元素会往前移动一位
      cnt++; //记录删除元素的个数
    }
  }
  return cnt;
}

//第六关:替换元素和删除重复元素
//将顺序表L中值为x的数据元素替换为y
void replace_seq(PseqList L, int x, int y) { 
  for(int i = 0; i < L->curNum; i++) {
    if(L->element[i] == x) { //找到匹配的元素
      L->element[i] = y; //替换元素
    }
  }
}

//移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组并在使用O(1) 额外空间的条件下完成
void delDuplicate_seq(PseqList L) { 
  for(int i = 0; i < L->curNum-1; i++) {
    for(int j = i+1; j < L->curNum; j++) {
      if(L->element[i] == L->element[j]) { //找到重复的元素
        deletePos_seq(L, j); //删除重复的元素
        j--; //需要将j回退1,因为删除元素后后面的元素会往前移动一位
      }
    }
  }
}

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那个人有梦想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值