算法和数据结构——顺序表

/顺序表
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct table
{
    int size,count;//代表顺序表中所存储的长度和拥有数据的数量
    int *data;//连续的存储区 
}table;

table *getnewtable(int n)
{
    table *T=(table*)malloc(sizeof(table));//顺序表的连续存储空间 
    T->count=0;//初始化顺序表中元素为0
    T->size=n;//初始化顺序表中的长度为n
    T->data=(int *)malloc(sizeof(int)*n);//顺序表中数据连续的存储空间 
    return T; 
    
}

int insert(table *T,int val,int pos)
{
    if(pos<0||pos>T->size)return 0;
    if(T->size==T->count)return 0;//顺序表中最大能存储的长度已经等于count 
    for(int i=T->count-1;i>=pos;i--){
        T->data[i+1]=T->data[i];
    }//要使得顺序表中从pos元素开始平行向后移动一位
    //逆序变量是为了防止元素被覆盖导致元素被丢弃 
    T->data[pos]=val;//pos位置插入val值 
    T->count+=1;//顺序表中的元素数据加1 
    return 1;
}

//给定值来删除对应的值 
int removedata(table *T,int val)//给出指定的值进行删除 
{
    if(T->count==0) return 0;//顺序表中的元素都没有删什么啊
    int pos=0;
    while(val!=T->count){
        pos++;
    }
    for(int i=pos+1;i<T->count;i++){
        T->data[i]=T->data[i+1];
    }
    T->count-=1;
    return 1;
     
}

int removepos(table *T,int pos)//通过位置删除指定元素 
{
    if(pos<0||pos>T->size)return 0;
    if(T->count==0) return 0;
    for(int i=pos+1;i<T->count;i++){
        T->data[i]=T->data[i+1];//向前移动一位进行覆盖 
    }
    T->count-=1;
    return 1;
}

int expand(table *T)//扩容操作 
{
/*
realloc的工作机制
一:在原来的基础上向后扩展一片新的内存
二:如果发现在原来基础扩展一片内存还是不够,realloc会寻找新的内存地址来进行扩容
三:如果第二种方法也扩容不成功,则realloc会返回NULL
所以为了防止内存地址丢失,需要重新开辟新的指针来判断realloc的返回状态,如果为NULL则不进行任何操作,否则在原来data的区域上扩展内存 
*/
    if(T==NULL) return 0;
    int *p=(int*)realloc(T->data,sizeof(int)*2*T->size);
    if(p==NULL) return 0;
    T->data=p;
    T->size*=2;//二倍扩展内存 
    return 1;
}

int search(table *T,int val)//顺序表中搜索指定元素 
{
    if(T->count==0) return 0;
    int pos=0;
    while(val!=T->count){
        pos++;
    }
    if(pos==T->count-1) return 0;//没找到
    return pos; 
}

void clear(table *T)
{
    if(T->size!=0) free(T->data);
    free(T);
    return ; 
}

void output(table *T)//输出output函数 
{
    int len=0;
    for(int i=0;i<T->size;i++){
        len+=printf("%3d ",i);
    }
    printf("\n");
    for(int i=0;i<len;i++){
        printf("--");
    }
    printf("\n");
    for(int i=0;i<T->count;i++){
        printf("%3d ",T->data[i]);
    }
    return ;
}
#define Max 20
int main(void)
{
    srand(time(0));//产生随机数
    table *T=getnewtable(Max); 
    for(int i=0;i<Max;i++){
        int p=rand()%4,pos,val;//p为产生0-3的数字
        switch(p){
            case 0:
            case 1:
            case 2:
                pos=rand()%(T->count+2);
                val=rand()%100;
                printf("insert %d at %d to table = %d\n",val,pos,insert(T,pos,val));
                break;
            case 3:
                pos=rand()%(T->count+2);
                printf("remove item at %d to table = %d\n",pos,removepos(T,pos));
                break;
        } 
    }
    output(T);
    clear(T);
    return 0;

注:输出函数海贼胡船长的输出代码进行改写

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值