顺序表的相关操作

相关操作包括:

  • 顺序表的初始化
  • 顺序表的创建 (头插,尾插,中间插入数据)
  • 顺序表的删除 (头删,尾删,中间删除数据)
  • 查询顺序表数据
  • 修改顺序表数据
  • 顺序表数据排序
  • 顺序表的销毁
具体的代码分成三个部分,分别是:

1.seqlist.h(用来存放函数的头文件,声明函数)
2.seqlist.c (存放顺序表中用到的具体函数)
3.test.c (用来测试顺序表各种函数运行后的结果)

seqlist.h部分

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

#ifndef _SEQLIST_H__
#define _SEQLIST_H__

#define MAX_NUM 100
//#define DataType int
typedef int DataType;

typedef struct seqlist
{
    DataType  arr[MAX_NUM];
    int size;
}seqlist;    //结构体重定义,seqlist是结构体的类型

void SeqInit(seqlist *qseq);      // 初始化顺序表
void PushBack(seqlist *qseq, int data);   //尾插
void PushFront(seqlist *qseq, int data);   //头插
void PushInsert(seqlist *qseq,int pos, int data);  //在顺序表中任意地方插入
void PrintSeq(seqlist *qseq);  //打印顺序表

void PopBack(seqlist *qseq);   //尾删
void PopFront(seqlist *qseq);   //头删    
void Erase(seqlist *qseq,DataType pos); //在删除指定位置上的数据
void ModifySeq(seqlist *qseq,DataType pos,DataType data);
int SearchSeq(seqlist *qseq,DataType data);  //返回 所查询数据的下标
void RemoveSeq(seqlist *qseq,DataType data);  //查询并删除数据
void BubbleSeq(seqlist *qseq);  //冒泡排序
int BinarySeq(seqlist *qseq,DataType data);  //二分查找,找到返回下标

void DestorySeq(seqlist *qseq,DataType data);   //销毁顺序表




#endif //_SEQLIST_H__

seqlist.c部分

#include "seqlist.h"
#include <stdio.h>


void SeqInit(seqlist *qseq) //初始化结构体,全部置为空
{
    assert(qseq != NULL);
    qseq->size = 0;
}

void PrintSeq(seqlist *qseq) //打印顺序表
{
    int i = 0;
    for(i = 0; i< qseq->size; i++)
    {
      printf("%d  ",qseq->arr[i]);
    }
    printf("\n");

}


//插
void PushBack(seqlist *qseq, int data)  //尾插
{
    assert(qseq != NULL);
    //assert(qseq->size== MAX_NUM);
    if(qseq->size== MAX_NUM)
    {
         printf("顺序表已满,无法插入\n");
         return ;
    }
    else
    {
         qseq->arr[qseq->size] = data;
         qseq->size++;
    }
}

void PushFront(seqlist *qseq, int data)  //头插
{
    int i= 0;;
    //int i = 0;
    //for(i=0; i<qseq->size; i++)
    //{
    //  qseq->arr[qseq->size-i] = qseq->arr[qseq->size-1-i];    
    //}
    assert(qseq!=NULL);
    if(qseq->size==MAX_NUM)
    {
         printf("顺序表已满,无法插入\n");
         return ;
    }
    else
    {
      for(i=qseq->size-1; i>=0; i--)
      {
          qseq->arr[i+1] = qseq->arr[i];
      }

    }
    qseq->arr[0] = data;
    qseq->size++;
}

void PushInsert(seqlist *qseq,int pos, int data) //在顺序表中任意地方插入
{
    int i = 0;
    for(i= qseq->size-1; i>= pos; i--)
    {
       qseq->arr[i+1] = qseq->arr[i];
    }   
    qseq->arr[pos] = data;
    qseq->size++;
}


//删
void PopBack(seqlist *qseq)   //尾删
{
    assert(qseq!=NULL);   //传址地址不为空
    assert(qseq->size>0);   //顺序表不为空
    qseq->size--;
}

void PopFront(seqlist *qseq)   //头删
{
    int i = 0;
    assert(qseq!=NULL);   //传址地址不为空
    assert(qseq->size>0);   //顺序表不为空
    for(i=1; i<=qseq->size-1; i++)
    {
        qseq->arr[i-1] = qseq->arr[i];
    }
    qseq->size--;
}

void Erase(seqlist *qseq,int pos)     //在删除指定位置上的数据
{
    int i = pos;  //pos代表的是第几个元素,最小是第一个元素,最大是第size个元素
    assert(qseq != NULL);
    assert(qseq->size>0);
    assert(pos>=0 && pos<= qseq->size);
  for(i; i+1<= qseq->size-1; i++)
  {   
      qseq->arr[i] = qseq->arr[i+1];       
  }
  qseq->size--;
}


//改
void ModifySeq(seqlist *qseq,int pos,int data)   //
{
   qseq->arr[pos] = data;
}


//查
int SearchSeq(seqlist *qseq,int data)  //返回 所查询数据的下标
{
    int i = 0;
    for(i=0; i<qseq->size-1; i++)
    {
        if(data == qseq->arr[i])
        {
           return i;
        }
    }
    return -1;
}

//销毁顺序表
void DestorySeq(seqlist *qseq)  //销毁顺序表
{
    qseq->size = 0;
}

//查找并删除 顺序表中的某个数据
void RemoveSeq(seqlist *qseq,DataType data)  
{
      int pos = SearchSeq(qseq,data);
      if(pos == -1)
      {
          return -1;
      }
    Erase(qseq,pos);
}

void BubbleSeq(seqlist *qseq) //冒泡排序
{
    int i=0;
    int j = 0;
    int tmp = 0;
    int flag;
    assert(qseq != NULL);
    assert(qseq->size>0);
    for(i=0; i<qseq->size-1; i++)
    {
        flag = 0;
       for(j=0; j<qseq->size-1-i; j++)
       {
          if(qseq->arr[j]>qseq->arr[j+1])
          {
             flag=1;
             tmp = qseq->arr[j];
             qseq->arr[j] = qseq->arr[j+1];
             qseq->arr[j+1] = tmp;
          }
       }
       if(flag==0)  //说明 顺序表 原本就有序(相邻的两个数之间没有进行交换)
       {
         break;
       }
    }
}

int  BinarySeq(seqlist *qseq,DataType data) //二分查找,找到返回下标
{
   int left = 0;
   int right =qseq->size-1;
   int mid = left+(right-left)/2;
   while(left<=right)
   {
       if(data>qseq->arr[mid])
       {
           left = mid+1;
           mid = left+(right-left)/2;
       }
       else if(data<qseq->arr[mid])
       {
             right = mid - 1;
             mid = left+(right-left)/2;   
       }
       else
       {
          return mid;
       }
   }
   return -1;

}

test.c部分

#include "seqlist.h"

int main()
{
    int ret = 0;
    seqlist seq;
    SeqInit(&seq);  

    //PushBack(&seq,5);
    //PushBack(&seq,3);
    //PushBack(&seq,8);
    //PushBack(&seq,1);
    //PushBack(&seq,2); //53812
    //PrintSeq(&seq);   //打印顺序表

    //PushFront(&seq,5);
    //PushFront(&seq,4);
    //PushFront(&seq,3);
    //PushFront(&seq,2);
    //PushFront(&seq,1);  //12345
 //   PrintSeq(&seq);

    //PushFront(&seq,5);
    //PushFront(&seq,4);
    //PushFront(&seq,3);
    //PushFront(&seq,2);
    //PushFront(&seq,1);
    //PushInsert(&seq,3,8);  //在下标为3的地方插入8     123845
    //PrintSeq(&seq);
 //   PushInsert(&seq,2,9);  //在下标为2的地方插入9     1293845
    //PrintSeq(&seq);

 //   PopBack(&seq);
    //PrintSeq(&seq);    //129384

    //PopFront(&seq);    
    //PrintSeq(&seq);  //29384

    //Erase(&seq,1);  
 //   PrintSeq(&seq);    //删除下标为1的数据   2384

    //ModifySeq(&seq,3,9);
    //PrintSeq(&seq);   //2389

    //SearchSeq(&seq,8);  //输出数据8 对应的下标 即2
    //ret = SearchSeq(&seq,8);


    //  RemoveSeq(&seq,8);
    //  PrintSeq(&seq);
    //if(ret == -1)
    //{
    //    printf("没找到"); 
    //}
    //else 
    //  printf("%d",ret);   

    PushFront(&seq,5);
    PushFront(&seq,8);
    PushFront(&seq,3);
    PushFront(&seq,2);
    PushFront(&seq,4);
    PushFront(&seq,1);
    PushFront(&seq,7);
    PushFront(&seq,10);
    PushFront(&seq,9);
    PushFront(&seq,6);

    BubbleSeq(&seq);   //1 2 3 4 5 6 7 8 9 10
    PrintSeq(&seq);  
    BinarySeq(&seq,7);
    ret = BinarySeq(&seq,7);
    if(ret==-1)
    {
       printf("找不到\n");
    }
    else
    {
       printf("找到了,下标为%d\n",ret);
    }
    //DestorySeq(&seq);
    //PrintSeq(&seq);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值