顺序表2

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

#define SeqListMaxSize 1000 

 typedef char SeqType; 

 typedef struct SeqList
 { 
    SeqType data[SeqListMaxSize]; 
    size_t size; 
 }SeqList; 

/** 
 *  * @brief 给一个顺序表进行初始化 
 *  * 
 *   * @param seq 表示一个顺序表结构的指针 
 *   */ 
void SeqListInit(SeqList* seq) 
{  
    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
  
    memset(seq->data,0,1000*sizeof(SeqType));   
    seq->size=0;

}



/** 
 *  * @brief 将一个元素插入到顺序表的末尾 
 *  * 
 *   * @param seq 顺序表结构的指针 
 *   * @param value 新插入的值 
 *   */ 
void SeqListPushBack(SeqList* seq, SeqType value) 
{
   
    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
   if(seq->size==SeqListMaxSize)
   {
     printf("The Seqlist is FULL!\n");
     exit(0);
   }

     seq->data[seq->size]=value;
     seq->size++;
}




/** 
 *  * @brief 将顺序表的最后一个元素删除 
 *  * 
 *   * @param seq 顺序表结构的指针 
 *   */ 
void SeqListPopBack(SeqList* seq)
{
     
    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
    if(seq->size==0)
   {
    printf("NO data to be delet!");
    exit(0);
   }

     seq->data[seq->size-1]=0;
     seq->size--;

}



/** 
 *  * @brief 往顺序表的前面插入一个元素 
 *  * 
 *   * @param seq 顺序表结构的指针 
 *   * @param value 新插入的值 
 *   */ 
void SeqListPushFront(SeqList* seq, SeqType value) 
{
    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
    
   if(seq->size==SeqListMaxSize)
   {
     printf("The Seqlist is FULL!\n");
     exit(0);
   }
   size_t i=seq->size;
   for(i;i>0;i--)
   {
     seq->data[i]=seq->data[i-1];
   }
   seq->data[0]=value;   
   seq->size++;

}



/** 
 *  * @brief 删除顺序表的第一个元素 
 *  * 
 *   * @param seq 顺序表结构的指针 
 *   */ 
void SeqListPopFront(SeqList* seq)
{
   
    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
    if(seq->size==0)
   {
    printf("NO data to be delet!");
    exit(0);
   }
  
   int i=0;

   for(i=0;i<(seq->size-1);i++)
   {
     seq->data[i]=seq->data[i+1];
   }

     seq->data[i]=0;

     seq->size--;
}


/** 
 *  * @brief 取顺序表中任意位置的一个元素 
 *  * 
 *   * @param seq 顺序表的指针 
 *   * @param pos 要取的元素的下标 
 *   * @param default_value 如果取元素失败, 就返回这个值 
 *   * 
 *    * @return 对应下标位置的元素的值 
 *    */ 
SeqType SeqListGet(SeqList* seq, size_t pos, SeqType default_value) 
{

    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
   if(seq->data[pos]==0)
   {
     return default_value;
   }
   else
   {
     return seq->data[pos];
   }


}


/** 
 *  * @brief 将顺序表中指定位置的值进行设置 
 *  * 
 *   * @param seq 顺序表的结构指针 
 *   * @param pos 要修改的顺序表的元素位置 
 *   * @param value 要设置的值. 
 *    */ 
void SeqListSet(SeqList* seq, size_t pos,  SeqType value)
{

    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
    if(seq->data[pos]==0)
   {
    printf("NO data to be SET!");
    exit(0);
   }
    else
   { 
     seq->data[pos]=value;
   }

}



/** 
 *  * @brief 查找顺序表中指定元素的下标 
 *  * 
 *   * @param seq 顺序表结构指针 
 *   * @param value 要查找的值 
 *   * 
 *    * @return 对应值的下标. 如果找不到, 就返回 
 *    * (size_t)-1 
 *     */ 
size_t SeqListFind(SeqList* seq, SeqType value)
{
    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
    if(seq->size==0)
   {
    printf("NO data to be FIND!");
    exit(0);
   }
   size_t i=0;
   for(i;i<seq->size-1;i++)
   {
    if(seq->data[i]==value)
    {
      return i;
    }
   } 
    return -1;


}


/** 
 *  * @brief 在指定位置插入元素 
 *  * 
 *   * @param seq 顺序表指针 
 *   * @param pos 要插入的位置 
 *   * @param value 要插入的值. 
 *    */ 
void SeqListInsert(SeqList* seq, size_t pos,  SeqType value) 
{

    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
    if(seq->size==SeqListMaxSize)
   {
     printf("The Seqlist is FULL!\n");
     exit(0);
   } 
   if(seq->size<=pos)
  {
    seq->data[seq->size]=value;
  }
  else
  {
   size_t i;
   for(i=seq->size;i>pos;i--)
   {
       seq->data[i]=seq->data[i-1];
   }
       
      seq->data[pos]=value;
      
       seq->size++;
   }
}





/** 
 *  * @brief 删除指定位置的元素 
 *  * 
 *   * @param seq 顺序表指针 
 *   * @param pos 要删除的元素位置 
 *   */ 
void SeqListErase(SeqList* seq, size_t pos)
{

    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
    if(seq->size-1<pos)
    {
     printf("The position is no value!");
     exit(0);
    }
    size_t i;
    for(i=pos;i<seq->size-1;i++)
    {
     seq->data[i]=seq->data[i+1];
    }
      seq->data[i]=0;   
       seq->size--;
                
}



/** 
 *  * @brief 删除顺序表中指定的值, 如果存在重复元素, 只删除第一个 
 *  * 
 *   * @param seq 顺序表指针 
 *   * @param to_delete 待删除的值 
 *   */ 
void SeqListRemove(SeqList* seq, SeqType to_delete) 
{
    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
   size_t i=0;
  for(i;i<seq->size-1;i++)
  {
    if(seq->data[i]==to_delete)
    {
      SeqListErase(seq,i);
      break;
    }
  }
   if(i==seq->size-1)
   {
    printf("The to_delete was not find!");
   }

}



/** 
 *  * @brief 删除顺序表中所有的指定的值, 另外要实现一个时间复杂度为 O(N) 的优化版本 
 *  * 
 *   * @param seq 顺序表指针 
 *   * @param to_delete 待删除的元素 
 *   */ 
void SeqListRemoveAll(SeqList* seq, SeqType to_delete) 
{
    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
   size_t i;
   size_t count=0;
   size_t flag=0;
   size_t j=0;
//O(N^2) 
   for(i=0;i<seq->size-1;i++)
   {
     if(seq->data[i]==to_delete)
     {
       SeqListErase(seq,i);
     }
   }

//0(N)The seplist should be sorted
   for(i=0;i<seq->size-1;i++)
   {
     if(seq->data[i]==to_delete)
     {
        if(count==0)
        {
          flag=i;
        }
       count++;

     }
     else if(count!=0)
     {
      seq->data[flag+j]=seq->data[i];
      j++;
     }
   }
  
      seq->data[flag+j]=0;

}



/** 
 *  * @brief 获取顺序表元素个数 
 *  * 
 *   * @param seq 顺序表指针 
 *   * 
 *    * @return 顺序表元素的个数 
 *    */ 
size_t SeqListSize(SeqList* seq)
{
 
    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
   return seq->size;


}






/** 
 *  * @brief 判定顺序表是否为空 
 *  * 
 *   * @param seq 顺序表指针 
 *   * 
 *    * @return 如果顺序表为空, 返回 1; 否则返回 0 
 *     */ 
int SeqListEmpty(SeqList* seq)
{

    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }
   if (seq->size==0)
  {
   return 1;
  }
  else
  {
   return 0;
  }


}


/** 
 *  * @brief 冒泡排序 
 *  * 
 *   * @param seq 顺序表指针 
 *   */ 
void SeqListBubbleSort(SeqList* seq) 
{

    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }  
   size_t flag=0;
   size_t i=0;
   size_t j=0; 
   char tmp;
   for(i=0;i<seq->size-1;i++)
   { 
      flag=0;
      for(j=0;j<seq->size-1-i;j++)
      {
        if(seq->data[j]>seq->data[j+1])
         {
           flag=1;
            tmp=seq->data[j];
            seq->data[j]=seq->data[j+1];
            seq->data[j+1]=tmp;
         }

      } 
      if(flag==0)
      {
        break;
      }   
   }
 
}


int cmp_char( void *p1,void *p2)
{
 
 return ( *(char*)p1 > *(char*)p2);

}
/** 
 *  * @brief 冒泡排序 
 *  * 
 *   * @param seq 顺序表指针 
 *   */ 
void SeqListBubbleSortEx(SeqList* seq, int (*cmp)(void*p1 , void*p2)) 
{

    if(seq==NULL)
   {
     printf("The Seqlist is NULL!\n");
     exit(0);
   }  
   size_t flag=0;
   size_t i=0;
   size_t j=0; 
   char tmp;
   for(i=0;i<seq->size-1;i++)
   { 
      flag=0;
      for(j=0;j<seq->size-1-i;j++)
      {
        if(cmp(&seq->data[j],&seq->data[j+1])>0)
         {
           flag=1;
            tmp=seq->data[j];
            seq->data[j]=seq->data[j+1];
            seq->data[j+1]=tmp;
         }

      } 
      if(flag==0)
      {
        break;
      }   
   }


}



int main()
{

  SeqList *p=(SeqList*)malloc(sizeof(SeqList));
 
  SeqListInit(p); 

  SeqListPushBack(p, 'a'); 
  SeqListPopBack(p); 

  SeqListPushBack(p, 'a'); 
  SeqListPushBack(p, 'a'); 
  SeqListPushBack(p, 'a'); 
  SeqListPushBack(p, 'b'); 
  SeqListPushBack(p, 'c'); 

  printf("The pos 3 is '%c'.\n", SeqListGet(p, 3, 'm')); 

  SeqListPushFront(p, 'z'); 
  SeqListPopFront(p); 

  printf("The pos 3 is %c.\n", SeqListGet(p, 3, 'm')); 

  SeqListSet(p, 2, 'x'); 
 
  printf("The pos is %d.\n",SeqListFind(p, 'x')); 

  SeqListInsert(p, 3, 'n');
 
  SeqListErase(p, 3); 

  printf("The size of seqlist is %d. \n",SeqListSize(p)); 
  
  SeqListRemove(p, 'x'); 
 
  SeqListBubbleSortEx(p, cmp_char); 
  
  SeqListRemoveAll(p, 'a');
 
  printf("The size of seqlist is %d.\n",SeqListSize(p)); 

  SeqListBubbleSort(p); 

  SeqListEmpty(p); 

  return 0;
}

首先,我们需要创建两个`std::vector`类型的顺序表(也叫动态数组),然后分别从键盘读取输入数据并填充它们。接着,我们将顺序表2的数据逆序,再将其逐个添加到顺序表1的末尾。最后,我们遍历顺序表1并输出结果。 以下是一个简单的C++代码示例: ```cpp #include <iostream> #include <vector> // 假设这是一个顺序表的节点类型 struct Node { int data; Node* next; }; // 功能:生成顺序表,从键盘输入 void createSequentialList(std::vector<Node*>& list, bool reverseInput) { Node* newNode = new Node(); int input; std::cout << "Enter elements for the list: "; while (std::cin >> input) { newNode->data = reverseInput ? input : -input; // 如果reverseInput为真,输入的值取反 newNode->next = list.empty() ? nullptr : list.back(); // 将新元素添加到列表尾部 list.push_back(newNode); } } int main() { std::vector<Node*> seqList1, seqList2; // 生成顺序表1 createSequentialList(seqList1, false); // 生成顺序表2 std::cout << "\nEnter elements for the reversed list: "; createSequentialList(seqList2, true); // 输入逆序 // 逆序顺序表2 for (auto it = seqList2.begin(); it != seqList2.end(); ++it) { Node* temp = *it; *it = *--seqList2.end(); *seqList2.end() = temp; } // 合并顺序表2到顺序表1 seqList1.insert(seqList1.end(), seqList2.begin(), seqList2.end()); // 遍历并输出顺序表1 std::cout << "Merged list: "; for (const auto& node : seqList1) { std::cout << node->data << " "; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值