文章目录

  • 一、结构体的定义
  • 二、顺序表的各个函数接口实现
  • 1.初始化顺序表
  • 2.顺序表的插入
  • 1)尾插(SeqListPushBack)
  • 2)头插(SeqListPushFront)
  • 3)随意插入(SeqListInsert)
  • 3.顺序表的删除
  • 1)尾删(SeqListPopBack)
  • 2)头删(SeqListPopFront)
  • 3)随意删除(SeqListPopDelete)
  • 4.顺序表的查找(SeqListFind)
  • 5.顺序表的修改(SeqListModify)
  • 6.顺序表的销毁(SeqListDestroy)
  • 7.顺序表的打印(SeqListPrint)
  • 三、关于顺序表的一些题目
  • 1移除元素
  • 2.合并两个有序数组


一、结构体的定义

typedef int elemtype;  //元素类型重命名,增强代码的可维护性

typedef struct seqlist
{
	elemtype *a;    //指向动态开辟的数组
	int size;    //有效数据的个数
	int capacity;    //顺序表的容量
}SL;

二、顺序表的各个函数接口实现

1.初始化顺序表

void SeqListInit(SL*ps)
{
	ps->a = (elemtype*)malloc(4*sizeof(elemtype));
	if (ps->a == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	ps->size = 0;
	ps->capacity = 4;    //先给4个容量
}

2.顺序表的插入

先检查顺序表的容量是否满了,满了的话就进行扩容

void SeqListCheckCapacity(SL* ps)
{
	if (ps->size == ps->capacity)    //size与capacity相等说明顺序表已满
	{
		elemtype* temp = (elemtype*)realloc(ps->a, ps->capacity * 2 * sizeof(elemtype));
        //将容量扩大为原来的两倍
		if (temp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);//退出程序
		}
		else
		{
			ps->a = temp;
			ps->capacity *= 2;
		}
	}
}

1)尾插(SeqListPushBack)

void SeqListPushBack(SL* ps, elemtype x)
{
	SeqListCheckCapacity(ps);//检查容量是否满了,以及满了之后的扩容操作
	ps->a[ps->size] = x;
	ps->size++;    //有效数据个数加一
}

2)头插(SeqListPushFront)

void SeqListPushFront(SL* ps, elemtype x)
{
	SeqListCheckCapacity(ps);
	int end = ps->size - 1;    //end是表中最后一个元素
	while (end >= 0)    //以下操作是将顺序表中的元素从后往前依次后移,将第一个位置空出来
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[0] = x;
	ps->size++;
}

3)随意插入(SeqListInsert)

void SeqListInsert(SL* ps, int pos, elemtype x)
{
	if (pos > ps->size)     //pos是待插入的位置
		return;
	int end = ps->size - 1;     //end为顺序表中最后一个元素
	while (end >= pos)
	{
		ps->a[end+1] = ps->a[end];    //将pos以及pos之后的元素依次后移
		end--;
	}
	ps->a[pos] = x;
	ps->size++;    //有效数据加一
}

3.顺序表的删除

1)尾删(SeqListPopBack)

void SeqListPopBack(SL* ps)
{
	if (ps->size == 0)    //判断顺序表中是否有数据
		return;
	
		ps->size--;     //尾删,直接将有效数据数减一即可
}

2)头删(SeqListPopFront)

void SeqListPopFront(SL* ps)
{
	if (ps->size == 0)    //判断顺序表中是否有数据
		return;
	
	int start = 0;
	while (start-1 < ps->size)
	{
		ps->a[start] = ps->a[start + 1];
		start++;
	}
		ps->size--;      //有效数据减一
}

3)随意删除(SeqListPopDelete)

void SeqListDelete(SL* ps, int pos)    //pos是待删除的位置
{
	if (ps->size == 0)    //判断顺序表中是否有数据
		return;
	int start = pos;    //从pos处开始
	while (start < ps->size)
	{
		ps->a[start] = ps->a[start + 1];
		start++;
	}
	ps->size--;
}

4.顺序表的查找(SeqListFind)

int SeqListFind(SL* ps, elemtype x)
{
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
			return i;	  //找到了,返回下标值
	}
	return -1;	   //没有找到,返回-1
}

5.顺序表的修改(SeqListModify)

void SeqListModify(SL* ps, int pos, elemtype x)
{
	if (pos > ps->size)
		return;
	ps->a[pos] = x;
}

6.顺序表的销毁(SeqListDestroy)

void SeqListDestroy(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->size = 0;
}

7.顺序表的打印(SeqListPrint)

void SeqListPrint(SL ps)       //不改变数组,不需要用指针
{
	for (int i = 0; i < ps.size; i++)
	{
		printf("%d  ",ps.a[i]);
	}
		printf("\n");
}

三、关于顺序表的一些题目

1移除元素

力扣题目:移除元素

int removeElement(int* nums, int numsSize, int val){

int src=0,dst=0;
//双指针:如果src处不是val,则把src放到dst处,src++,dst++,如果是val,src++
while(src<numsSize)
{
    if(nums[src]!=val)
    {
        nums[dst]=nums[src];
        dst++;
        src++;

    }
    else
    {
        src++;
    }
}
    return dst;     //dst之前的都是要保留下来的元素
}

c语言描述数据结构与算法 数据结构c语言描述李晔_c语言

2.合并两个有序数组

力扣题目:合并两个有序数组