数据结构头歌——顺序线性表——课上练

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

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

第2关:顺序线性表插入

你需要实现不同的插入操作:

在顺序线性表中下标为p位置、p位置之前、p位置之后插入数据元素

第3关:销毁线性表

销毁线性表的实质时实现动态分配的线性表空间回收。

第4关:查找

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

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

第5关:删除

(1)在顺序表L中删除下标pos处的数据元素

(2)在顺序表L中删除与参数x值相同的数据元素

第6关:顺序表应用

(1)使用将顺序表L中值为x的数据元素替换为y;

(2)此处假设线性表中的元素用于表示集合,不考虑线性表中元素的位置,移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。

上面六关的代码答案都是下面的同一个哦!

#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 
 PseqList plist = (PseqList)malloc(sizeof(struct seqList));
    if(plist == NULL||m==0) 
      return NULL; //分配空间失败
    plist->MAXNUM = m ;
    plist->curNum = 0;
    plist->element = (DataType *)malloc(sizeof(DataType)*m);
    if(plist->element == NULL) 
    {
        free(plist);
        return NULL;
    }
    return plist;
    
}

//第二关
int isFullList_seq(PseqList L)
{
  //判断顺序线性表是否已满,若已满,返回值为1,否则返回值为0
 	if(L->MAXNUM == L->curNum)    
	 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;
  }
  if(p >= L->curNum + 1 || p < 0)
  {
    printf("position is illegel");
    return 0; 
  }
  
  for (int i = L->curNum; i >= p + 1 ; i --)
  {
    L->element[i] = L->element[i - 1]; 
  }
  L->element[p] = x;
  L->curNum++;
 
  return 1;  
}

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

int insertPost_seq(PseqList L , int p ,int x)
{
 // 在线性表L中下标为p的位置的后面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//提示:直接调用insertP函数实现即可    
    
    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;
	else
	{
		int m = L->curNum;
    	free(L->element);
    	free(L);
    	return m;
	}
}

//第四关
int locate_seq(PseqList L,int x)
{//在顺序表L中查找给定值x首次出现的位置,若不存在给定值,则返回-1
	int i = 0;
	for(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 < 0 || pos >= L->curNum)    return L->element[0];
  return L->element[pos];
}
 
//第五关
int deletePos_seq(PseqList L,int pos)
{//在顺序表L中删除与下标pos处的数据元素,若pos非法,则返回-1;否则返回1
	int i = 0; 
  	if(pos < 0 || pos >= L->curNum)    return -1;
  
  	for(i = pos; i < L->curNum - 1; i ++)    
  		L->element[i] = L->element[i + 1];
  	L->curNum--;
  	return 1;   
}
 
int delete_seq(PseqList L,int x)
{//在顺序表L中删除与参数x值相同的数据元素,返回删除数据元素的个数
  //可以使用之前已完成的操作
  int cnt = 0,num = L->curNum;
  int i = 0, r = 0;
  for(i = 0; i < num; i ++)
  {
    if(L->element[i] != x)
    {
		    L->element[r] = L->element[i];
        r++;
	  }
    else    
		L->curNum--,cnt++;
  }
  return cnt;
  
}




//第六关
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;){
    	int ret=1;
    	for(int j=i+1;j<L->curNum;j++){
      		if(L->element[j]==L->element[i]){
        		delete_seq(L,L->element[i]);				// 删除所有值为 element[i]的元素
        		ret=0;
        		break;
      		}
    	}
    	if(ret){
      		i++;						// 如果 位置 i上的元素不是重复值,则跳到下一个index。如果是重复值,则不用跳到下一索引,因为删除操作会自动移位。
    	}  
  	}
 
 
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
链表是一种常见的数据结构,由一系列的节点组成,每个节点包含两部分信息:数据和指针。指针指向下一个节点,这样就形成了一个链式结构。 在链表的操作中,第一关是顺序构建线性表。构建线性表的目标是按照一定的顺序将节点依次连接起来。 首先,我们需要声明一个链表的数据结构,包含节点的定义和指针的定义。节点由数据和指针两个部分组成。数据部分存储着节点中的数值,指针部分指向下一个节点。 接下来,我们可以按照指定的顺序依次创建节点并连接起来。首先创建一个头节点,并将链表的头指针指向该节点。然后,根据顺序,创建第一个节点,并将头节点的指针指向第一个节点。继续依次创建其他节点,将前一个节点的指针指向当前节点,直到创建完最后一个节点。 在构建线性表的过程中,我们需要注意节点之间的指针连接,以确保链表的完整性。每次创建一个节点,都要将前一个节点的指针指向当前节点。 在构建线性表完成后,我们可以通过遍历链表来验证是否按照指定顺序构建。从头节点开始,按照指针的指向逐个输出节点中的数据,确定节点的顺序是否正确。 总之,顺序构建线性表是链表操作中的第一关。通过按照指定的顺序创建节点并连接起来,我们可以构建一个完整的链表。通过遍历链表验证节点的顺序,可以确保链表的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值