c语言中顺序表的实现

今天我们来实现一下顺序表。

代码如下:


Seqlist.h

<span style="font-size:18px;">#ifndef __SEQLIST_H__ 
#define __SEQLIST_H__   
   
#include<stdio.h>  
#include<stdlib.h>  
#include<assert.h>  
   
#define INIT_SIZE  2  
#define ADD_SIZE 3  
typedef int DataType;  
   
typedef struct Seqlist  
{  
    DataType *data;  
    int size;                         //当前空间存储的元素个数  
    int capacity;                     //当前空间所能存储的最大容量  
}Seqlist,*pSeqlist;  
   
void InitSeqlist(pSeqlist pSeq);  
void DestorySeqlist(pSeqlist pSeq);  
void PushBack(pSeqlist pSeq,DataType x);  
void PopBack(pSeqlist pSeq);  
void PushFront(pSeqlist pSeq,DataType x);  
void PopFront(pSeqlist pSeq);  
void Remove(pSeqlist pSeq,DataType x);  
void RemoveAll(pSeqlist pSeq,DataType x);  
void BubbleSort(pSeqlist pSeq);  
void InsertSort(pSeqlist pSeq);  
void SelectSort(pSeqlist pSeq);  
int BinarySearch(pSeqlist pSeq,DataType x);  
void  Erase(pSeqlist pSeq,int pos);  
void PrintSeqlist(pSeqlist pSeq);  
   
#endif             //SEQLIST_D_H__</span>
Seqlist.c

<span style="font-size:18px;"><strong>#include"seqlist.h"
void InitSeqlist(pSeqlist pSeq)                 
{  
    pSeq->data = (DataType *)malloc(INIT_SIZE*sizeof(DataType));  
    if (pSeq->data == NULL)  
    {  
        printf("out of memory\n");  
        exit(1);  
    }  
    pSeq->size = 0;  
    pSeq->capacity = INIT_SIZE;     //将容量置为当前空间所能存储的最大值  
}  
   
void DestorySeqlist(pSeqlist pSeq)  
{  
    free(pSeq->data);  
    pSeq->data = NULL;  
    pSeq->size = 0;  
    pSeq->capacity = 0;  
}  
   
void CheckCapacity(pSeqlist pSeq)       //查看当前空间是否已满  
{  
    assert(pSeq);  
    if (pSeq->size == pSeq->capacity)    //如果满了则进行扩容  
    {  
        DataType *tmp = NULL;                           
        tmp = (DataType *)realloc(pSeq->data, (pSeq->capacity += ADD_SIZE)*sizeof(DataType));  
        if (NULL == tmp)  
        {  
            printf("out of memory\n");  
            exit(1);  
        }  
        pSeq->data = tmp;  
    }  
}  
   
void PushBack(pSeqlist pSeq, DataType x)  
{  
    assert(pSeq);  
    CheckCapacity(pSeq);                  //只要插入元素,首先就要检查空间是否以满  
    pSeq->data[pSeq->size++] = x;         //插入元素后size也要变化  
}  
   
void PopBack(pSeqlist pSeq)  
{  
    assert(pSeq);  
    if (pSeq->size == 0)                   //异常情况,表已空  
    {  
        printf("表已空\n");  
        return;  
    }  
    pSeq->size--;  
}  
   
void PushFront(pSeqlist pSeq, DataType x)  
{ 
int i = 0;
    assert(pSeq);  
    CheckCapacity(pSeq);            //只要插入元素,首先就要检查空间是否以满  
      
    for (i = pSeq->size; i > 0; i--)   //从后往前先将数据移动  
    {  
        pSeq->data[i] = pSeq->data[i-1];  
    }  
    pSeq->data[0] = x;  
    pSeq->size++;  
}  
   
void PopFront(pSeqlist pSeq)  
{  
int i = 0;
    assert(pSeq);
    if (pSeq->size == 0)                     //异常情况,表空  
    {  
        printf("表已空\n");  
        return;  
    }  
    for (i = 0; i < pSeq->size-1; i++)        //直接从第二个元素依次向前覆盖  
    {  
        pSeq->data[i] = pSeq->data[i + 1];  
    }  
    pSeq->size--;  
}  
   
void Remove(pSeqlist pSeq, DataType x)       //删除第一个出现的x  
{  
int i = 0;  
    int j = 0;
    assert(pSeq);   
    for (i = 0; i < pSeq->size; i++)  
    {  
        if (pSeq->data[i] == x)  
        {  
            for (j = i; j < pSeq->size-1; j++)      //删除的时候从这个元素的后面向前覆盖  
            {  
                pSeq->data[j] = pSeq->data[j + 1];  
            }  
            pSeq->size--;  
            return;  
        }  
    }  
}  
   
void RemoveAll(pSeqlist pSeq, DataType x)  
{  
int i = 0;  
    int j = 0;
    assert(pSeq);    
    for (i = 0; i < pSeq->size; i++)  
    {  
        if (pSeq->data[i] == x)  
        {  
            for (j = i; j < pSeq->size - 1; j++)      //删除的时候从这个元素的后面向前覆盖  
            {  
                pSeq->data[j] = pSeq->data[j + 1];  
            }  
            pSeq->size--;  
        }  
    }  
}  
   
void BubbleSort(pSeqlist pSeq)  
{  
int flag = 0;  
    int i = 0;  
    int j = 0;  
    int k = pSeq->size-1;
    assert(pSeq);
    for (i = 0; i < pSeq->size - 1; i--)  
    {  
        int m = 0;  
        flag = 1;                               //将标记置1  
        for (j = 0; j < k; 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 = 0;  
                m = j;                           //记录最后一次交换的位置  
            }  
        }  
        if (flag)               //标记位1表示已经有序  
        {  
            return;  
        }  
        m = k;                  //将k设置成最后一次交换的位置  
    }  
}  
   
void InsertSort(pSeqlist pSeq)                //插入排序  
{  
int i = 0;  
    int j = 0; 
    assert(pSeq);  
    for (i = 1; i < pSeq->size; i++)  
    {  
        DataType tmp = pSeq->data[i];  
        for (j = i-1; j >=0; j--)  
        {  
            if (pSeq->data[j]>tmp)
            {  
                pSeq->data[j+1] = pSeq->data[j];  
            }  
            else  
            {  
                break;  
            }  
        }  
        pSeq->data[j+1] = tmp;
    }  
}  
   
void SelectSort(pSeqlist pSeq)  
{  
int i = 0;  
    int j = 0;  
    int k = 0;  
    assert(pSeq);  
    for (i = 0; i < pSeq->size; i++)  
    {  
        k = i;  
        for (j = i + 1; j < pSeq->size; j++)  
        {  
            if (pSeq->data[k]>pSeq->data[j])  
            {  
                k = j;
            }  
        }  
        if (k != i)  
        {  
            DataType tmp = pSeq->data[k];  
            pSeq->data[k] = pSeq->data[i];  
            pSeq->data[i] = tmp;  
        }  
    }  
}  
   
int BinarySearch(pSeqlist pSeq, DataType x)  
{  
int left = 0;  
    int right = pSeq->size - 1;
int mid=0;
    assert(pSeq);  
    mid = (left&right) + ((left^right) >> 1);  //求平均值  
    while (left <= right)  
    {  
        if (pSeq->data[mid]>x)  
        {  
            right = mid - 1;  
        }  
        else if (pSeq->data[mid] < x)  
        {  
            left = mid + 1;  
        }  
        else  
        {  
            return mid;  
        }  
    }  
    return -1;  
}  
   
void  Erase(pSeqlist pSeq, int pos)  
{  
int i = 0;
    assert(pSeq);   
    if (pos>= pSeq->size&&pos < 0) 
    {  
        printf("删除位置不合法\n");  
        return;  
    }  
    for (i = pos; i < pSeq->size - 1; i++)      //从pos之后依次向前覆盖  
    {  
        pSeq->data[i] = pSeq->data[i + 1];  
    }  
    pSeq->size--;  
}  
   
void PrintSeqlist(pSeqlist pSeq)  
{   
    int i = 0;
assert(pSeq);  
    if (pSeq->size == 0)  
    {  
        printf("表为空\n");  
        return;  
    }  
    for (i = 0; i < pSeq->size; i++)  
    {  
        printf("%d ", pSeq->data[i]);  
    }  
    printf("\n");  
}</strong></span>
test.c

<strong><span style="font-size:18px;">#include"seqlist.h"  
   
void menu()  
{  
    printf("0.exit            1.PrintSeqlist \n");  
    printf("2.InitSeqlist     3.PushBack     \n");  
    printf("4.Popback         5.PushFornt    \n");  
    printf("6.PopFornt        7.Erase        \n");  
    printf("8.Remove          9.RemoveAll    \n");  
    printf("10.BubbleSort     11.BinarySearch\n");  
    printf("12.DestorySeqlist 13.InsertSort  \n");  
    printf("14.SelectSort           \n");  
    printf("请输入:>");  
}  
   
   
void test(pSeqlist pSeq)  
{  
    DataType x = 0;  
    int n = 0;  
    int pos = 0;
int ret=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);  
            PushFront(pSeq, x);  
            break;  
        case 6:  
            PopFront(pSeq);  
            break;  
        case 7:  
            printf("请输入删除位置\n");  
            scanf("%d", &pos);  
            Erase(pSeq, pos);  
            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:  
            BubbleSort(pSeq);  
            break;  
        case 11:
            printf("请输入元素\n");  
            scanf("%d", &x);  
            ret=BinarySearch(pSeq, x);  
            if (ret == -1)  
                printf("没有这个元素\n");  
            printf("下标为:%d\n", ret);  
            break;  
        case 12:  
            DestorySeqlist(pSeq);  
            break;  
        case 13:  
            InsertSort(pSeq);  
            break;  
        case 14:  
            SelectSort(pSeq);  
            break;  
        default:  
            printf("输入无效\n");  
            break;  
        }  
    }  
}  
   
   
   
int main()  
{  
    Seqlist pSeq;  
    test(&pSeq);  
    system("pause");  
    return 0;  
}</span></strong>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值