顺序表(静态)操作实现


seqlist.h

 #ifndef  __SEQLIST_H__
 #define  __SEQLIST_H__

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


 #define  MAX_SIZE 10
typedef int DataType;

 typedef struct Seqlist
{
    DataType  data[MAX_SIZE];//数据
    int sz;//个数
}Seqlist,*pSeqlist;
 //初始化
 void InitSeqList(pSeqlist pSeq);
 //打印 
 void PrintSeqList(pSeqlist pSeq);
 //尾部插入元素
 void PushBack(pSeqlist pSeq,DataType d);
 //尾部删除元素
 void PopBack(pSeqlist pSeq);
 //头部插入
 void PushFrount(pSeqlist pSeq,DataType d);
// 头部删除
 void PopFrount(pSeqlist pSeq);
 //查找元素
 int Find(pSeqlist pSeq, DataType d); 
//指定位置插入 
void Insert(pSeqlist pSeq, int pos, DataType d); 
//删除指定位置元素 
void Erase(pSeqlist pSeq, int pos); 
//删除指定元素 
void Remove(pSeqlist pSeq, DataType d); 
//删除所有的指定元素 
void RemoveAll(pSeqlist pSeq, DataType d); 
//返回顺序表的大小 
int Size(pSeqlist pSeq); 
//判断顺序表是否为空 
int Empty(pSeqlist pSeq); 
//冒泡排序 
void BubbleSort(pSeqlist pSeq); 
//选择排序 
void SelectSort(pSeqlist pSeq); 
//选择排序的优化 
void SelectSortOP(pSeqlist pSeq); 
//二分查找 
int BinarySearch(pSeqlist pSeq, DataType d); 
//二分查找递归写法 
int BinarySearch_R(pSeqlist pSeq, int left, int right, DataType d); 



 #endif //__SEQLIST_H__

seqlist.c

 #include "seqlist.h"
void InitSeqList(pSeqlist pSeq)
{
    assert(pSeq != NULL);
    pSeq->sz=0;
    memset(pSeq->data,0,sizeof(pSeq->data));
}

 void PushBack(pSeqlist pSeq,DataType d)
 {
     assert(pSeq != NULL);
     if(pSeq->sz==MAX_SIZE)
     {
         printf("已满/n");
         return;
     }
     pSeq->data[pSeq->sz]=d;
     pSeq->sz++;
 }

 void PopBack(pSeqlist pSeq)
 {
     assert(pSeq !=NULL);
     if(pSeq->sz==0)
     {
         printf("为空不可删除\n");
         return;
     }
     pSeq->data[pSeq->sz-1]=0;
     pSeq->sz--;
 }

void PrintSeqList(pSeqlist pSeq)
{
    int i=0;
    assert(pSeq!=NULL);
    for(i=0;i<pSeq->sz;i++)
    {
        printf("%d  ",pSeq->data[i]);
    }
    printf("\n");
}

void PushFrount(pSeqlist pSeq,DataType d)
{
    int i=0;
    assert(pSeq!=NULL);
    if(pSeq->sz==MAX_SIZE)
    {
        printf("已满\n");
        return;
    }
    for(i=pSeq->sz;i>0;i--)
    {
        pSeq->data[i]=pSeq->data[i-1];
    }
    pSeq->data[0]=d;
    pSeq->sz++;
}

void PopFrount(pSeqlist pSeq)
{
    int i=0;
    assert(pSeq!=NULL);
    if(pSeq->sz==0)
    {
        printf("为空不可删除\n");
        return;
    }
    for(i=0;i<pSeq->sz-1;i++)
    {
        pSeq->data[i]=pSeq->data[i+1];
    }
    pSeq->sz--;
}

int Find(pSeqlist pSeq, DataType d)
{
    int i=0;
    assert(pSeq!=NULL);
    for(i=0;i<pSeq->sz;i++)
    {
        if(pSeq->data[i]==d)
        {
            printf("找到了\n");
            return 1;
        }
        else
        {
            printf("没找到\n");
            return 0;
        }
    }

}

void Insert(pSeqlist pSeq, int pos, DataType d)
{
    int i=0;
    assert(pSeq!=NULL);

    if(pos< (pSeq->sz))
    {
        for( i=pSeq->sz;i>pos;i--)
        {
            pSeq->data[i]=pSeq->data[i-1];
        }
        pSeq->data[pos]=d;
    }
    pSeq->sz++;
}

void Erase(pSeqlist pSeq, int pos)
{
    int i=0;
    assert(pSeq!=NULL&&pos>=0&&pos<pSeq->sz);
    if(pSeq->sz==0)
    {
        printf("为空不可删\n");
            return;
    }
    for(i=pos;i<pSeq->sz-1;i++)
    {
        pSeq->data[i]=pSeq->data[i+1];
    }
    pSeq->sz--;
}

void Remove(pSeqlist pSeq, DataType d)
{
    int j=0;
    assert(pSeq!=NULL);
    for(j=0;j<pSeq->sz-1;j++)
    {
        if(pSeq->data[j]==d)
            Erase(pSeq, j);
    } 
}

void RemoveAll(pSeqlist pSeq, DataType d)
{
    int i=0;
    int j=0;
    assert(pSeq!=NULL);
    while(i<pSeq->sz)
    {   
    for(j=0;j<pSeq->sz-1;j++)
    {
        if(pSeq->data[j]==d)
            Erase(pSeq, j);
    } 
    i++;
    }
}

int Size(pSeqlist pSeq)
{
    assert(pSeq!=NULL);
    printf("%d",pSeq->sz);
    return pSeq->sz;
}

int Empty(pSeqlist pSeq)
{
    if(pSeq->sz==0)
    {
        printf("为空表");
        return 0;
    }
    else
    {
        printf("不为空表");
        return 1;
    }
}

void sort(DataType*a,DataType*b)
{
    DataType tmp=*a;
    *a=*b;
    *b=tmp;
}
void BubbleSort(pSeqlist pSeq)
{
    int i=0;
    int j=0;
    int tmp=0;
    assert(pSeq!=NULL);
    for(i=0;i<pSeq->sz;i++)
    {
        for( j=0;j<pSeq->sz-1-i;j++)
        {
        if(pSeq->data[j]>pSeq->data[j+1])
        {
            sort(pSeq->data+j,pSeq->data+j+1);
        }
        }
    }
}


void SelectSort(pSeqlist pSeq)
{
    int i=0;
    int j=0;
    assert(pSeq!=NULL);
    for(i=0;i<pSeq->sz-1;i++)
    {
            int tmp=0;
        for(j=1;j<pSeq->sz-i;j++)
        {
            if(pSeq->data[j]>pSeq->data[tmp])
            {
                tmp=j;
            }   
        }
        if(tmp!=pSeq->sz-1-i)
        {
            sort(pSeq->data+tmp,pSeq->data+pSeq->sz-i-1);
        }
    }

}


int BinarySearch(pSeqlist pSeq, DataType d)
{
    int left =0;
    int right=pSeq->sz-1;

    assert(pSeq!=NULL);
    while(left<right)
    {
        int mid =left+(right-left)/2;
        if(pSeq->data[mid]<d)
        {
            left=mid+1;
        }
        else    
        {
            if(pSeq->data[mid]>d)
        {
            right=mid-1;
        }
        else
        {
            printf("找到了%d\n",mid);
            return mid;
        }
        }
    }
}

int BinarySearch_R(pSeqlist pSeq, int left, int right, DataType d)
{
    int mid =left+(right-left)/2;
    assert(pSeq!=NULL); 
        if(pSeq->data[mid]<d)
        {
            left=mid+1;
            BinarySearch_R(pSeq,  left,  right,  d);
        }
        else    
        {
            if(pSeq->data[mid]>d)
        {
            right=mid-1;
            BinarySearch_R( pSeq, left,  right,  d);
        }
            else
                printf("找到了,下标为%d\n",mid);
}
}

test.c

 #include<stdio.h>
 #include "seqlist.h"
void test()
{
   Seqlist seq;
   InitSeqList(&seq);
   PushBack(&seq,1);
   PushBack(&seq,2);
   PushBack(&seq,3);
   PushBack(&seq,1);
   PushBack(&seq,4);
  // PopBack(&seq);
  // PrintSeqList(&seq);
  // PushFrount(&seq,3);
  // PrintSeqList(&seq);
  //PopFrount(&seq);
  //PrintSeqList(&seq);
  // Find(&seq,2);
  //Insert(&seq,2,8);
  //PrintSeqList(&seq);
  //rase(&seq,0);
  //PrintSeqList(&seq);
  // Remove(&seq,2);
  // PrintSeqList(&seq);
  // RemoveAll(&seq,1);
  //PrintSeqList(&seq);
  // Size(&seq);
  // Empty(&seq);
   BubbleSort(&seq);
   PrintSeqList(&seq);
   SelectSort(&seq);
// PrintSeqList(&seq);
// BinarySearch(&seq,3);
// BinarySearch_R(&seq,0,4,2);
   PrintSeqList(&seq);
}

int main()
{
    test();
    system("pause");
    return 0;
}

自己实现的,可能有些地方有问题或有待优化,欢迎大家帮忙指出啊

猜你喜欢

转载自blog.csdn.net/S_Sandra/article/details/80742332