数据结构-顺序表习题

1.定义一个采用顺序结构存储的线性表,设计算法完成下面的工作: 将所在奇数移到所有偶数的前面,要求算法的时间复杂度为O(n),空间复杂度为O(1)。要求:1、在main函数中验证:原始数组为{1,2,3,4,5,6,7,8,9,10},将其奇偶交换后再将数组中的元素打印出来。2、将主要的奇偶交换代码以及运行结果截图

2.删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);要求:1、在main函数中验证:原始数组为{1,2,3,4,5,6,7,8,9,10},删除[1,5]区间内的数据,再将删除后数组中的元素打印出来。2、将主要的删除代码以及运行结果截图

代码:

/*定义一个采用顺序结构存储的线性表,设计算法完成下面的工作:
删除元素在[x, y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1);
*/

//顺序表结构体定义
#include<stdio.h>
#define MAXSIZE 100
#include <malloc.h>
typedef  struct{
    int Data[MAXSIZE];
    int Last;
}List;
//1.创建空表 
List *MakeEmpty( )
{    List *PtrL;
     PtrL = (List*)malloc(sizeof(List));
     PtrL->Last = -1; 
     return PtrL;
}
//2.查找元素x
int Find( int X, List *PtrL )
{   int i = 0;
    while(i <= PtrL->Last && PtrL->Data[i]!= X)
        i++;
    if (i > PtrL->Last)  return -1;   /* 如果没找到,返回-1 */
    else  return i;              /* 找到后返回的是存储位置 */
}
//3.插入元素x,插入位置为第i个结点位置 
void Insert( int X, int i, List *PtrL )
{       int j;
        if ( PtrL->Last == MAXSIZE-1 ){  /* 表空间已满,不能插入*/
                 printf("表满"); 
                 return; 
        }  
        if ( i < 1 || i > PtrL->Last+2) { /*检查插入位置的合法性*/
               printf("位置不合法");
               return; 
        } 
        for ( j = PtrL->Last; j >= i-1; j-- )
               PtrL->Data[j+1] = PtrL->Data[j];  /*将 ai~ an倒序向后移动*/
        PtrL->Data[i-1] = X;   /*新元素插入*/
        PtrL->Last++;              /*Last仍指向最后元素*/
        return; 

//4.删除第i个结点 
void Delete( int  i, List *PtrL )
{      int  j;
       if( i < 1 || i > PtrL->Last+1 ) { /*检查空表及删除位置的合法性*/
            printf ("不存在第%d个元素", i ); 
            return ; 
       }
       for ( j = i; j <= PtrL->Last; j++ )
            PtrL->Data[j-1] = PtrL->Data[j];  /*将 ai+1~ an顺序向前移动*/
       PtrL->Last--;    /*Last仍指向最后元素*/
       return;   
}
//5.打印顺序表中的元素值 
void Display( List *PtrL )
{     int i; 
      for ( i=0;i<= PtrL->Last; i++)
          printf("%d ",PtrL->Data[i]);
      printf("\n");        

void Delete_x2y(int x,int y, List *PtrL )
{
    int j=0;
    for (int i=0;i<= PtrL->Last; i++){
        if(PtrL->Data[i]<x||PtrL->Data[i]>y){
            PtrL->Data[j++]=PtrL->Data[i];;
            };    
    }
    PtrL->Last=j-1;
}
void Adjust(List *Ptrl){
    int p=0,q=Ptrl->Last,temp;
    while(p<q){
        while(Ptrl->Data[p]%2==1){
            p++;
        }
        while(Ptrl->Data[q]%2==0){
            q--;
        }    
        if(p<q){
            temp=Ptrl->Data[p];
            Ptrl->Data[p]=Ptrl->Data[q];
            Ptrl->Data[q]=temp;
        }
    }
}
int main()
{    
    int x=1,y=5;
    int i; 
    //新建空的顺序表
    List *L=MakeEmpty();
    // 插入元素i,插入位置为第i个结点位置 ,共插入1....10个结点 
    
    for(i=1;i<=10;i++){
        Insert(i, i, L);
    }
    printf("原数组:\n");
    Display(L); 
    //删除[1,5]区间内的数据
    printf("删除[1,5]区间内的数据:\n"); 
     Delete_x2y(x,y,L);
     Display(L);
     
//    Adjust(L); 
//    printf("奇偶交换后的数组:\n"); 
//     Display(L);     
     
    return 0; 
}
 

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一.单选题(共10题,5) 1线性表采用链式存储结构时,其地址( )。A、必须是连续的B、部分地址必须是连续的C、一定是不连续的D、连续与否均可以正确答案: D 2带头结点的单链表head为空的判断条件是( )。A、head=NULLB、head->next=NULLC、head->next=headD、head!=NULL正确答案: B 3将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是( )。A、nB、2n-1C、 2nD、n-1正确答案: A 4在一个单链表中,已知q所指结点是p所指结点的前趋结点,若在q和p之间插入s结点,则执行( )。A、 s->next=p->next;p->next=sB、p->next=s->next;s->next=pC、q->next=s;s->next=pD、p->next=s;s->next=q正确答案: C 5向一个有 127 个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动( )个元素。A、64B、63C、63.5D、7正确答案: C 插入 n/2 删除 n-1/2 查询 n+1/2 6若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( )存储方式最节省运算时间。A、单链表B、仅有头指针的单循环链表C、双链表D、仅有尾指针的单循环链表正确答案: D 7若长度为n的线性表采用顺序存储结构,在其第个i位置插入一个新元素算法的时间复杂度为( )。A、 O(log2n)B、O(1)C、O(n)D、O(n2) 正确答案: C 8线性表的静态链表存储结构与顺序存储结构相比优点是( )。A、所有的操作算法简单B、便于插入和删除C、便于利用零散的存储空间D、便于随机存取正确答案: B 9在一个单链表中, 若删除 p 所指结点的后续结点, 则执行( )A、s->next=p;p->next=s;B、s->next=p->next;p=s;C、s->next=p->next;p->next=s;D、p->next=s;s->next=p;正确答案: B 10一个线性表第一个元素的存储地址是 100, 每个元素的长度为 2,则第 5 个元素的地址是( )A、110B、108C、100D、120

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值