顺序表的基本算法

#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __SEQLIST_H__  
#define __SEQLIST_H__  

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

#define MAX 100  
typedef int DataType;

typedef struct Seqlist
{
    DataType Data[MAX];
    DataType sz;
}Seqlist, *pSeqlist;

void PrintSeqlist(pSeqlist pSeq);         //打印顺序表  
void InitSeqlist(pSeqlist pSeq);          //初始化顺序表      
void PushBack(pSeqlist pSeq, DataType x); //从后面插入一个元素  
void Popback(pSeqlist pSeq);              //抛出最后面的  
void PushFornt(pSeqlist pSeq, DataType x);//在头部插入一个元素  
void PopFornt(pSeqlist pSeq);             //删除头元素  
void Insert(pSeqlist pSeq, int pos, DataType x);//指定位置插入  
void Remove(pSeqlist pSeq, DataType x);   //移除第一个出现的x  
void RemoveAll(pSeqlist pSeq, DataType x);//移除全部的x  
void Sort(pSeqlist pSeq);                 //排序顺序表    
int BinarySearch(pSeqlist pSeq, DataType x);//二分查找,返回元素所在下标  

#endif         //__SEQLIST_H__  




#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"  

void PrintSeqlist(pSeqlist pSeq)
{
    assert(pSeq);
    int i = 0;
    if (pSeq->sz == 0)     //异常情况,表为空                              
    {
        printf("表是空表\n");
    }
    else
    {
        for (i = 0; i < pSeq->sz; i++)
        {
            printf("%d  ", pSeq->Data[i]);
        }
        printf("\n");
    }
}


void InitSeqlist(pSeqlist pSeq)
{
    assert(pSeq);
    pSeq->sz = 0;
}


void PushBack(pSeqlist pSeq, DataType x)
{
    assert(pSeq);
    if (pSeq->sz == MAX)                                        //异常情况,表为满  
    {
        printf("表已满\n");
        return;
    }
    pSeq->Data[pSeq->sz] = x;
    pSeq->sz++;
}


void Popback(pSeqlist pSeq)
{
    assert(pSeq);
    if (pSeq->sz == 0)                                           //异常情况,表为空  
    {
        printf("表已空\n");
        return;
    }
    pSeq->sz--;
}


void PushFornt(pSeqlist pSeq, DataType x)
{
    assert(pSeq);
    int i = 0;
    if (pSeq->sz == MAX)   //异常情况,表为满                                        
    {
        printf("表已满\n");
        return;
    }
    for (i = pSeq->sz; i > 0; i--)
    {
        pSeq->Data[i] = pSeq->Data[i - 1];
    }
    pSeq->Data[0] = x;
    pSeq->sz++;
}


void PopFornt(pSeqlist pSeq)
{
    assert(pSeq);
    int i = 0;
    if (pSeq->sz == 0)     //异常情况,表为空                                        
    {
        printf("表已空\n");
        return;
    }
    for (i = 0; i< pSeq->sz - 1; i++)
    {
        pSeq->Data[i] = pSeq->Data[i + 1];
    }
    pSeq->sz--;
}


void Insert(pSeqlist pSeq, int pos, DataType x)
{
    assert(pSeq);
    int i = 0;
    if (pSeq->sz == MAX)  //异常情况,表为满                                   
    {
        printf("表已满\n");
        return;
    }
    if (pos > pSeq->sz&&pos<0)   //插入位置小于0或者大于sz都是不合法,顺序表要求位置连续                            
    {
        printf("插入位置不合法\n");
        return;
    }
    for (i = pSeq->sz; i>pos; i--)
    {
        pSeq->Data[i] = pSeq->Data[i - 1];
    }
    pSeq->Data[pos] = x;
    pSeq->sz++;
}


void Remove(pSeqlist pSeq, DataType x)
{
    assert(pSeq);
    int i = 0;
    if (pSeq->sz == 0)     //异常情况,表为空                                       
    {
        printf("表已空\n");
        return;
    }
    while (i<pSeq->sz)
    {
        if (pSeq->Data[i] == x)
        {
            for (; i< pSeq->sz - 1; i++)
            {
                pSeq->Data[i] = pSeq->Data[i + 1];
            }
            pSeq->sz--;
            break;
        }
        i++;
    }
}


void RemoveAll(pSeqlist pSeq, DataType x)
{
    assert(pSeq);
    int i = 0;
    int j = 0;
    if (pSeq->sz == 0) //异常情况,表为空                                            
    {
        printf("表已空\n");
        return;
    }
    while (i <= pSeq->sz)
    {
        if (pSeq->Data[i] == x)
        {
            for (j = i; j< pSeq->sz - 1; j++)
            {
                pSeq->Data[j] = pSeq->Data[j + 1];
            }
            pSeq->sz--;
        }
        i++;
    }
}


void Sort(pSeqlist pSeq)
{
    assert(pSeq);
    if (pSeq->sz == 0)  //异常情况,表为空                                           
    {
        printf("表已空\n");
        return;
    }
    int i = 0;
    int j = 0;
    int flag = 0;
    for (i = 0; i < pSeq->sz - 1; i++)
    {
        flag = 0;
        for (j = 0; j < pSeq->sz - i - 1; j++)
        {
            if (pSeq->Data[j]>pSeq->Data[j + 1])
            {
                DataType tmp = pSeq->Data[j];
                pSeq->Data[j] = pSeq->Data[j + 1];
                pSeq->Data[j + 1] = tmp;
                flag = 1;
            }
        }
        if (flag == 0)
            break;
    }
}


int BinarySearch(pSeqlist pSeq, DataType x)
{
    assert(pSeq);
    if (pSeq->sz == 0)  //异常情况,表为空                                       
    {
        printf("表已空\n");
        return -1;
    }
    int left = 0;
    int right = pSeq->sz - 1;
    int mid = (left&right) + ((left^right) >> 1);                    //mid取平均值  
    while (left<right)
    {
        if (x>pSeq->Data[mid])
        {
            left = mid + 1;
            mid = (left&right) + ((left^right) >> 1);
        }
        else if (x<pSeq->Data[mid])
        {
            right = mid - 1;
            mid = (left&right) + ((left^right) >> 1);
        }
        else
        {
            printf("%d\n", mid);
            return mid;                                                        //返回这个元素所在的下标  
        }
    }
    return -1;
}



#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"  


void menu()
{
    printf("*********************************\n");
    printf("0.exit            1.PrintSeqlist \n");
    printf("2.InitSeqlist     3.PushBack     \n");
    printf("4.Popback         5.PushFornt    \n");
    printf("6.PopFornt        7.Insert       \n");
    printf("8.Remove          9.RemoveAll    \n");
    printf("10.Sort           11.BinarySearch\n");
    printf("请输入:>");
}

void test(pSeqlist pSeq)
{
    DataType x = 0;
    int n = 0;
    int pos = 0;
    while (1)
    {
        menu();
        scanf("%d", &n);
        switch (n)
        {
        case 0:
            exit(1);
            break;
        case 1:
            PrintSeqlist(pSeq);
            break;
        case 2:
            InitSeqlist(pSeq);
            break;
        case 3:
            printf("请输入元素\n");
            scanf("%d", &x);
            PushBack(pSeq, x);
            break;
        case 4:
            Popback(pSeq);
            break;
        case 5:
            printf("请输入元素\n");
            scanf("%d", &x);
            PushFornt(pSeq, x);
            break;
        case 6:
            PopFornt(pSeq);
            break;
        case 7:
            printf("请输入元素\n");
            scanf("%d", &x);
            printf("请输入插入位置\n");
            scanf("%d", &pos);
            Insert(pSeq, pos, x);
            break;
        case 8:
            printf("请输入元素\n");
            scanf("%d", &x);
            Remove(pSeq, x);
            break;
        case 9:
            printf("请输入元素\n");
            scanf("%d", &x);
            RemoveAll(pSeq, x);
            break;
        case 10:
            Sort(pSeq);
            break;
        case 11:
            printf("请输入元素\n");
            scanf("%d", &x);
            BinarySearch(pSeq, x);
            break;
        default:
            printf("输入无效\n");
            break;
        }
    }
}



int main()
{
    Seqlist pSeq;
    memset(pSeq.Data, 0, sizeof(DataType)*MAX);
    pSeq.sz = 0;
    test(&pSeq);
    system("pause");
    return 0;
}

【不足】
反馈信息做得不够好

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值