当前位置: 移动技术网 > IT编程>开发语言>C/C++ > C语言--动态顺序表

C语言--动态顺序表

2018年10月22日  | 移动技术网IT编程  | 我要评论

奇热剧集站,金皇朝娱乐,qq相片制作

  顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。分为静态顺序表和动态顺序表。

.h文件

 

#pragma once

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


typedef int datatype;
typedef struct seqlist//定义一个结构体
{
    datatype* arry;
    size_t size;
    size_t capacity;
}seqlist;

void initseqlist(seqlist*seq);//初始化结构体
void printseqlist(seqlist*seq);//输出函数
void pushback(seqlist*seq,datatype x);//后面插入数据
void popback(seqlist*seq);//后面删除数据
void pushfrant(seqlist*seq,datatype x);//前面插入数据
void popfrant(seqlist*seq);//前面删除数据
int find(seqlist*seq, datatype x);//查找数据
void erase(seqlist*seq,size_t pos);//清除第几个数据
void remove(seqlist*seq,datatype x);//删除第一个数据x
void removeall(seqlist*seq,datatype x);//删除所有的x
void firstremoveall(seqlist*seq, datatype x);//删除所有x的第二种方法
void modify(seqlist*seq, size_t pos, datatype x);//把第pos个数据修改成x
void insert(seqlist*seq, size_t pos, datatype x);//把第pos个数据插入x
void check(seqlist*seq);//判断指针是否有效,并动态开辟内存
void check(seqlist*seq)
{
    assert(seq);
    if (seq->size >= seq->capacity)
    {
        datatype* tmp;
        seq->capacity *= 2;
        tmp = (datatype*)malloc(sizeof(datatype)*(seq->capacity));
        memcpy(tmp, seq->arry, sizeof(datatype)*(seq->size));
        free(seq->arry);
        seq->arry=tmp;
    }
}

void initseqlist(seqlist*seq)
{
    assert(seq);
    seq->capacity = 2;
    seq->arry = (datatype*)malloc(sizeof(datatype)*seq->capacity);
    seq->size = 0;
     
}
void printseqlist(seqlist*seq)
{
    int i = 0;
    for (i = 0; i < (int)seq->size; i++)
    {
        printf("%d", seq->arry[i]);
    }
}
void pushback(seqlist*seq, datatype x)
{
     check(seq);
     seq->arry[seq->size++] = x;
}
void popback(seqlist*seq)
{
    assert(seq);
    --seq->size;
}
void pushfrant(seqlist*seq, datatype x)
{
    check(seq);
    int i = seq->size-1;
    for (; i >= 0; i--)
    {
        seq->arry[i + 1] = seq->arry[i];
    }
    seq->arry[0] = x;
    ++seq->size;
}
void popfrant(seqlist*seq)
{
    assert(seq);
    int i =0;
    for (; i<=(int)seq->size;i++)
    {
        seq->arry[i] = seq->arry[i+1];
    }
    --seq->size;
}
void remove(seqlist*seq, datatype x)
{
    assert(seq);
    int i = 0;
    for (; i<(int)seq->size; i++)
    {
        if (seq->arry[i] == x)
        {
            seq->arry[i] = seq->arry[i+1];
             
        }
    }
    --seq->size;
}
void removeall(seqlist*seq, datatype x)
{
    assert(seq);
    int firstindex = 0, secondindex = 0;
    int count = 0;
    while (secondindex<=(int)seq->size)
    {
        if (seq->arry[secondindex] == x)
        {      
            count++;
        }
        else
        {
            seq->arry[firstindex] = seq->arry[secondindex];
            firstindex++;
        }
        secondindex++;
    }
    seq->size-=count;   
}
void firstremoveall(seqlist*seq, datatype x)
{
    assert(seq);
    int i = 0;
    for (; i <(int)seq->size; i++)
    {
        if (seq->arry[i] == x)
        {
            int begin = i;
            for (; begin < (int)seq->size - 1; begin++)
            {
                seq->arry[begin] = seq->arry[begin + 1];
            }
            --seq->size;
            i--;
        }      
    }  
}
int find(seqlist*seq, datatype x)
{
    assert(seq);
    int i = 0;
    for (; i < (int)seq->size; i++)
    {
        if (seq->arry[i] == x)
        {
            return seq->arry[i];
        }
        else
        {
            return -1;
        }          
    }
    return 0;
}
void erase(seqlist*seq, size_t pos)
{
    assert(seq);
    int i = pos-1;
    for (; i<(int)seq->size-1; i++)
    {
        seq->arry[i] = seq->arry[i+1];             
    }
    --seq->size;
}
void modify(seqlist*seq, size_t pos, datatype x)
{
    check(seq);
    int i = 0;
    for (; i <(int) seq->size - 1; i++)
    {
        if (i== pos-1)
        {
            seq->arry[i] = pos;
        }
    }
}
void insert(seqlist*seq, size_t pos, datatype x)
{
    check(seq);
    int i = seq->size - 1;
    for (; i >= (int)pos; i--)
    {
        seq->arry[i + 1] = seq->arry[i];
    }
    seq->arry[pos] = x;
    seq->size++;
}

 

 

.c 文件

 

#include<stdio.h>
#include"test.h"
seqlist seq;
void test()
{
    pushback(&seq,1);
    pushback(&seq,2);
    pushback(&seq,3);
    pushback(&seq,4);
    popback(&seq);
    printseqlist(&seq);
}
void test1()
{
    pushfrant(&seq, 1);
    pushfrant(&seq, 2);
//  popfrant(&seq);
    pushfrant(&seq, 4);
    pushfrant(&seq, 3);
//  remove(&seq, 2);
//  removeall(&seq, 2);y
//  firstremoveall(&seq, 2);
//  erase(&seq, 1);
//  modify(&seq, 3, 2);
    insert(&seq, 4, 6);
    printseqlist(&seq);
}
int main(void)
{
    initseqlist(&seq);
    test1();
}

 

 

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网