静态顺序表

时间复杂度

//test.h
#pragma once

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10

typedef int DataType;

typedef struct SeqList     
{
    DataType _array[MAX_SIZE];
    int _size;         //顺序表中有效元素的个数
}Sql,*ps;              //对这个结构体类型重新定义一个名字Sqlist.
                       //对这个结构体指针类型重新定义一个名字ps.

void SqlInitList(ps p);                   //初始化顺序表,使数组的有效元素为零,相当于对数组的元素初始化.
//void InitList(Sqlist *ps)
void printSqlList(ps p);                   //打印顺序表
void SqlListpushback(ps p,DataType date);  //从顺序表数据后面添加数据
void SqlListpopback(ps p);                 //从表后删除一个
void SqlListpushfront(ps p,DataType data); //从顺序表数据的前面添加数据
void SqlListpopfront(ps p);                //从表中的前面删除一个数据
void SqlListinsert(ps p,DataType data, DataType place);//任意位置添加数据
void SeqListerase(ps p,DataType place);               //删除任意地方的一个数据
void SeqListReMove(ps p,int data);                     //删除一个指定的数据
void SeqListRemoveAll(ps p,int data);                  //删除某一个数值的所有值
void BubbleSort(ps p);                                 //冒泡排序法
void SelectSort(ps p);                                 //选择排序
int BinarySearch(ps p,int data);                       //二分查找
//test.c
#define _CRT_SECURE_NO_WARNINGS 1

#include "test.h"

//查找
int FindNum(ps p, DataType data)
{
    int i = 0;
    if(NULL == p)
    {
        exit(EXIT_FAILURE);
    }
    for(i=0; i<p->_size; i++)
    {
        if(p->_array[i] == data)
            return i;
    }
    return -1;
}

//初始化
void SqlInitList(ps p)     
{
    if(NULL == p)
    {
        return ;
    }
    p->_size = 0;
}

//尾添
void SqlListpushback(ps p,DataType date)   
{
    if(NULL == p)
    {
        return;
    }
    if(MAX_SIZE == p->_size)
    {
        printf("顺序表已满!!!\n");
        return;
    }
#if 0
    p->_array[p->_size] = date;
    ++p->_size;                  //数组有效元素加一
#endif
    SqlListinsert(p,date,p->_size);    //这里不能给p->_size减1

}

//尾删
void SqlListpopback(ps p)
{
    if(NULL == p)
    {
        return;
    }
    if(0 == p->_size)
    {
        printf("顺序表以为空!!!\n");
    }
#if 0
    --p->_size;
#endif
    SeqListerase(p,p->_size-1);
}

//打印
void printSqlList(ps p)                   
{
    int i = 0;
    if(NULL == p)
    {
        return ;
    }
    for(i=0; i<p->_size; ++i)
    {
        printf("%d ",p->_array[i]);
    }
    printf("\n");

}

//头部添加数据
void SqlListpushfront(ps p,DataType data)   
{
    int i = 0;
    if(NULL == p)
    {
        return ;
    }
    if(MAX_SIZE == p->_size)
    {
        printf("顺序表已满!!!\n");
        return ;
    }
#if 0
    for(i=p->_size; i>0; --i)
    {
        p->_array[i] = p->_array[i-1];
    }
    p->_array[0] = data;
    ++p->_size;
#endif
    SqlListinsert(p,data,0);
}

//头部删除数据
void SqlListpopfront(ps p)
{
    int i = 0;
    if(NULL == p)
    {
        return;
    }
#if 0
    for(i=0; i<p->_size-1; i++)     //这里的p->_size要减一,不的话就会使用p->_array[p->_size],这是一个无效数组元素。
    {
        p->_array[i] = p->_array[i+1];
    }
    --p->_size;
#endif
    SeqListerase(p,0);
}

//给任意地方添加数值
void SqlListinsert(ps p,DataType data, DataType place)    
{
    int i = 0;
    if((NULL == p)||(place<0 || place >p->_size))
    {
        printf("数据越界或地址为空!!!\n");
        return;
    }
    if(MAX_SIZE == p->_size)
    {
        printf("顺序表已满!!!\n");
        return;
    }
    for(i=p->_size; i>place; --i)
    {
        p->_array[i] = p->_array[i-1];
    }
    p->_array[place] = data;
    ++p->_size;
}

//删除某一个地方的数值
void SeqListerase(ps p,DataType place)   
{
    int i = 0;
    if(NULL == p)
    {
        return ;
    }
    for(i=place; i<p->_size-1; ++i)
    {
        p->_array[i] = p->_array[i+1];
    }
    --p->_size;
}

//删除一个数据的一种方法
//void SeqListReMove(ps p,int data)
//{
//  int i = 0;
//  if(NULL == p)
//  {
//      return ;
//  }
//  for(i=0; i<p->_size; i++)
//  {
//      if(p->_array[i] == data)
//      {
//          SeqListerase(p,i);
//          break;
//      }
//  }
//}

//删除某一个数值
void SeqListReMove(ps p,int data)  
{
    int i = 0;
    int ret = FindNum(p,data);
    if(NULL == p)
    {
        return ;
    }
    if(ret == -1)
    {
        printf("未找到数据!!!\n");
        return ;
    }
    SeqListerase(p,ret);
}

//删除某一个数值的所有值
void SeqListRemoveAll(ps p,int data)    
{
    int count = 0;
    int ret = FindNum(p,data) ;
    int i = ret;
    if(NULL == p)
    {
        return;
    }
    if(ret == -1)
    {
        printf("未找到数据\n");
        return ;
    }
    for(i=0; i<p->_size; ++i)
    {
        if(data == p->_array[i])
            count++;
        else
            p->_array[i-count] = p->_array[i];
    }
    p->_size-=count;
}

//交换
void Swap(int *p, int *q)
{
    int ret = 0;
    if(NULL == p || NULL == q)
    {
        return;
    }
    //*q = (*p)^(*q);    //这里使用异或方法会出现错误,因为第一次
    //                   //比较的两个数是同一块内存空间两个数异或
    //                 //,两个数异或同时为0.
    //*p = (*p)^(*q);    
    //*q = (*p)^(*q);    
    ret = *p;
    *p = *q;    
    *q = ret;

}

//冒泡排序
void BubbleSort(ps p)
{
    int i = 0;
    int j = 0;
    if(NULL == p)
    {
        return;
    }
    for(i=0; i<p->_size-1; i++)
    {
        int flag = 0;
        for(j=0; j<p->_size-1-i; j++)
        {  
            if(p->_array[j]>p->_array[j+1])
            {
                Swap(&(p->_array[j]) , &p->_array[j+1]);
                flag = 1;
            }
        }
        if(0 == flag)
            return ;
    }
}

//选择排序
void SelectSort(ps p)
{
    int i = 0;
    int j = 0;
    if(NULL == p)
        return;
    for(i=0; i<p->_size-1; i++)
    {
        int max = 0;
        for(j=1; j<p->_size-i; j++)
        {
            if(p->_array[max]<p->_array[j])
                max = j;
        }
        Swap(&(p->_array[max]),&(p->_array[p->_size-1-i]));
    }
}

//二分查找
int BinarySearch(ps p,int data)
{
    int left = 0;
    int right = p->_size-1;
    int mid = 0;
    while(left <= right)
    {
        mid = left +((right-left)>>1);  //这里注意+号的优先级高于<<,这里出现过错误
        if(p->_array[mid] == data)
        {
            return mid;
        }
        else if(p->_array[mid] > data)
            right = mid - 1;
        else if(p->_array[mid] < data)
            left = mid + 1;
    }
    return -1;
}
//main.c
#define _CRT_SECURE_NO_WARNINGS 1

#include "test.h"

int main()
{
    Sql s;
    SqlInitList(&s);
    printf("从头部添加数据:");
    SqlListpushback(&s,1);   //从头添加一个数据
    SqlListpushback(&s,4);
    SqlListpushback(&s,5);
    SqlListpushback(&s,2);
    SqlListpushback(&s,1);
    SqlListpushback(&s,92);
    SqlListpushback(&s,2);
    printSqlList(&s);       //打印这组有效数据


    SqlListpopback(&s);     //从尾删除一个数据
    printf("从尾部删除一个数据:");
    printSqlList(&s);

    SqlListpushfront(&s,8);  //从头部添加一个数据
    printf("从头部添加一个数据:");
    printSqlList(&s);
    SqlListpopfront(&s);     //从头部删除一个数据
    printf("从头部删除一个数据:");
    printSqlList(&s);

    SqlListinsert(&s,100,1); //在数组下标为1处添加一个数据100
    printf("在数组下标为1处添加一个数据100:");
    printSqlList(&s);

    SeqListerase(&s,3);      //删除下标为3的数据
    printf("删除下标为3的数据:");
    printSqlList(&s);

     SeqListReMove(&s,4);    //删除为4的一个数据
     printf("删除为4的一个数据;");
    printSqlList(&s);

    SeqListRemoveAll(&s,2);  //删除为2的所有元素
    printf("删除为2的所有元素:");
    printSqlList(&s);

    SelectSort(&s);          //选择排序
    //BubbleSort(&s);
    printf("选择排序的结果:");
    printSqlList(&s);


    printf("%d\n",BinarySearch(&s,92));  //查找为92的数,返回下标

    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值