9月18日数据结构顺序表作业

第一关:创建空顺序线性表

任务描述

        本关要求按照完成顺序表数据类型定义,并初始化一个顺序线性表。

编程要求

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

        本关的编程任务是补全文件中createNullList_seq函数,以实现初始化一个空的顺序线

第一关主函数

int main(void)
{
   int m;
   scanf("%d",&m);
   PseqList head = createNullList_seq(m);
   if(head == NULL)
       printf("fail to create");
    else
       printf("success to create a seqlist of %d elements,current item %d",m,head->curNum); 
}

第二关:顺序线性表的插入

        任务描述

        本关任务: 你需要实现不同的插入操作: 在顺序线性表中下标为p位置、p位置之前、p位置之后插入数据元素

        编程要求

        为了实现线性表插入操作,你需要实现判断线性表是否为满的判断函数,另外你需要根据提示,在右侧编辑器补充代码,完成操作insertP_seq,insertPre_seq,insertPost_seq三个插入函数,以及遍历输出线性表数据元素的操作printList_seq。具体说明见操作注释。

第二关主函数

int main(void)
{
     int m ,x;
     scanf("%d",&m);
     PseqList head = createNullList_seq(m);
     for(int i=0;i<m/2;i++)
     {
        scanf("%d",&x);
        insertP_seq(head,i,x);  
         
      }
     for(int i=0;i<m/2;i++)
        {
        scanf("%d",&x);
        insertPre_seq(head,i,x);  
        insertPost_seq(head,i,x);     
        }  
    printList_seq(head);
}

第三关:销毁线性表

任务描述

本关任务:销毁线性表的实质时实现动态分配的线性表空间回收。

相关知识

        使用malloc函数分配的内存空间应该在程序退出时使用free将空间回收还给操作系统。 由于顺序线性表创建时使用了malloc为线性表结构、线性表数据元素动态分配了存储空间,我们应使用free将相应空间回收。

编程要求

        根据提示,在右侧编辑器补充代码,实现销毁线性表的功能。

第三关主函数

int main(void)
{
     int m ,x;
     scanf("%d",&m);
     PseqList head = createNullList_seq(m);
     for(int i=0;i<m;i++)
     {
        scanf("%d",&x);
        insertP_seq(head,i,x);  
      }
   printf("%d", destroyList_seq(head));
    
}

第四关:查找

本关任务:

1.在顺序线性表中查找第一个值为x的元素下标。

2.在顺序线性表中查找某个位置pos处的数据元素

第四关主函数

int main(void)
{
     int m ,x;
     scanf("%d",&m);
     PseqList head = createNullList_seq(m);
     for(int i=0;i<m;i++)
     {
        scanf("%d",&x);
        insertP_seq(head,i,x);  
      }
    scanf("%d",&m);
    printf("%d\n",locatePos_seq(head,m));
    printf("%d\n",locate_seq(head,m));
    destroyList_seq(head);
    
}

第五关:删除

任务描述

本关任务: (1)在顺序表L中删除下标pos处的数据元素 (2)在顺序表L中删除与参数x值相同的数据元素

编程要求

根据提示,在右侧编辑器补充第五关的代码。

第五关主函数

int main(void)
{
     int m ,x;
     scanf("%d",&m);
     PseqList head = createNullList_seq(m);
     for(int i=0;i<m;i++)
     {
        scanf("%d",&x);
        insertP_seq(head,i,x);  
      }
    scanf("%d",&m);
    printf("%d\n",deletePos_seq(head,m));
    scanf("%d",&m);
   printf("%d\n",delete_seq(head,m));
    printList_seq(head);
    destroyList_seq(head);
    
}

第六关:顺序表的应用

任务描述

本关任务: (1)使用将顺序表L中值为x的数据元素替换为y; (2)此处假设线性表中的元素用于表示集合,不考虑线性表中元素的位置,移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。

编程要求

根据提示,在右侧编辑器补充代码,完成第六关的两个函数。

第六关主函数

int main(void)
{
     int m ,x;
     scanf("%d",&m);
     PseqList head = createNullList_seq(m);
     for(int i=0;i<m;i++)
     {
        scanf("%d",&x);
        insertP_seq(head,i,x);  
      }
    scanf("%d%d",&m,&x);
    replace_seq(head,m,x);
    delDuplicate_seq(head);
    printList_seq(head);
    destroyList_seq(head);
    
}

头文件,全局函数

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

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

typedef struct seqList *PseqList;
//第一关
PseqList createNullList_seq(int m)
{//此处填写代码,创建一个空的顺序线性表,能存放的最大元素个数为 m
 //若m=0,则返回NULL 
    if(m==0)return NULL;
    else{
      PseqList seqList =  (PseqList)malloc(sizeof(struct seqList));
      seqList->MAXNUM = m;
      seqList->curNum = 0;
      seqList->element = (int *)malloc(m*sizeof(int));
      return seqList;
    }
}

//第二关
int isFullList_seq(PseqList L)
{
  //判断顺序线性表是否已满,若已满,返回值为1,否则返回值为0
  if(L->curNum==(L->MAXNUM)-1) return 1;
  else return 0;
 

}


int insertP_seq(PseqList L , int p ,int x)
{// 在线性表L中下标为p的位置插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
   //如果线性表满了, 还需输"list is full"的提示
  //如果插入位置非法,需输出提示"position is illegel" 
   if(L->curNum>=L->MAXNUM){
     printf("list is full");
     return 0;
   }else if(L->curNum<p||p<0){
     printf("position is illegel");
     return 0;
   }else{
     for(int q = L->curNum-1;q>=p;q--){
       L->element[q+1] = L->element[q];
     }
     L->element[p] = x;
     L->curNum = L->curNum+1;
     return 1;
   }

}

int insertPre_seq(PseqList L , int p ,int x)
{
 // 在线性表L中下标为p的位置的前面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//提示:直接调用insertP函数实现即可    
    return insertP_seq(L,p-1,x);
    
}

int insertPost_seq(PseqList L , int p ,int x)
{
 // 在线性表L中下标为p的位置的后面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//提示:直接调用insertP函数实现即可    
    return insertP_seq(L,p+1,x);
    
}

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

//第三关
int destroyList_seq(PseqList L)
{
  
    //返回值为销毁的线性表中现有数据元素的个数,若待销毁的线性表不存在,则返回0
    if(L==NULL)return 0;

   
    free(L->element);

    return L->curNum;
    
}

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

}

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

//第五关
int deletePos_seq(PseqList L,int pos)
{//在顺序表L中删除与下标pos处的数据元素,若pos非法,则返回-1;否则返回1
    if(pos>L->curNum||pos<0) return -1;
    for(int i = pos;i<L->curNum;i++){
      L->element[i] = L->element[i+1];
    }
    L->curNum = L->curNum - 1;
    return 1;
}

int delete_seq(PseqList L,int x)
{//在顺序表L中删除与参数x值相同的数据元素,返回删除数据元素的个数
  //可以使用之前已完成的操作
  int count = 0;
  for(int i = 0;i<L->curNum;i++){
    if(L->element[i]==x){
      for(int j = i;j<L->curNum;j++){
        L->element[j]=L->element[j+1];
      }
      count++;
      L->curNum = L->curNum-1;
    }
  }
  return count;
}


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

}

void delDuplicate_seq(PseqList L)
{//移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成
  //使用常规删除即可,已修改测试用例
  
  for(int i = 0;i<L->curNum;i++){
    int temp = L->element[i];
    int flag = 0;
    for(int j = i+1;j<=L->curNum;j++){
      if(temp==L->element[j]){
        for(int k = j;k<L->curNum;k++){
          L->element[k] = L->element[k+1];
        }
        L->curNum = L->curNum-1;
        flag = 1;
      }
    }
    if(flag){
      for(int j = i;j<L->curNum;j++){
        L->element[j]=L->element[j+1];
      }
      L->curNum = L->curNum-1;
    }
  }
}





线性表中插入数据元素是一个常见的数据结构操作,这里提到的线性表可能是一个顺序表(seqList),即使用连续内存空间存储数据的线性表。在顺序表中,每个元素都有一个唯一的下标,用于标识其在表中的位置。在这个任务中,我们需要完成两个函数,一个是插入函数`insert_seq`,另一个是打印顺序表内容的函数`printList_seq`。 首先,`insert_seq`函数的目的是在顺序表`L`的下标为`p`的位置插入一个新的数据元素`x`。顺序表的下标通常从0开始计数,因此下标`p`表示在第`p+1`个位置插入元素。这个函数的参数包括顺序表的指针`L`、插入位置的下标`p`和要插入的数据元素`x`。函数的返回值是`int`类型,通常表示操作成功返回1,失败返回0或其他错误码。 插入操作的基本步骤包括: 1. 检查插入位置`p`是否有效,即是否在顺序表长度范围内。 2. 如果位置有效,从顺序表末尾开始,将所有元素向后移动一位,直到到达插入位置`p`。 3. 在位置`p`处插入新元素`x`。 4. 更新顺序表的长度。 `printList_seq`函数用于打印顺序表中的所有元素。参数`L`是指向顺序表的指针。函数没有返回值,它将遍历顺序表并打印每个元素。 伪代码示例如下: ```c int insert_seq(PseqList L , int p , int x) { if (p < 0 || p > L->length) { return 0; // 插入位置无效 } if (L->length == L->size) { return 0; // 顺序表已满,无法插入 } for (int i = L->length; i > p; i--) { L->data[i] = L->data[i - 1]; // 向后移动元素 } L->data[p] = x; // 插入新元素 L->length++; // 更新顺序表长度 return 1; // 插入成功 } void printList_seq(PseqList L) { for (int i = 0; i < L->length; i++) { printf("%d ", L->data[i]); // 打印每个元素 } printf("\n"); } ``` 这里需要注意的是,实际编写代码时应确保`PseqList`类型已经定义好,且包含数据数组`data`、当前长度`length`和最大容量`size`等成员。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小蒋的学习笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值