【C语言】实现动态顺序表

     其实动态顺序表就是在静态顺序表的基础上进行修改的,动态顺序表的底层实现是一个指向动态数组;我们根据存储数据的个数,在原开辟内存的基础上扩容,提供多余的空间储存数据;这种办法,不会造成多余开辟空间,对空间的浪费。也不会遇到储存数据太多,空间不够的情况(在正常内存范围内);下面同样使用三个函数文件实现:

Seqlist.h

#ifndef __SeqList_H__ 
#define __SeqList_H__ 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;
#define PrintType "%d "
//#define MAX 10
#define Orgin_capacity 2
#define Expand_INC 2


typedef struct SeqList
{
	DataType *data;//动态数组
	int sz;//顺序表元素个数
	int capacity;//当前容量
}SeqList,*pSeqList;


void InitSeqList(pSeqList ps);//初始化
void CheckSeqList(pSeqList ps);//内存大小检查及处理
void DestorySeqList(pSeqList ps);//内存释放
void PushBack(pSeqList ps, DataType d);//尾部插入数据d
void PushFront(pSeqList ps, DataType d);//在头部插入数据d
void DisPlay(pSeqList ps);//打印所有数据
void PopBack(pSeqList ps);//尾部删除数据
void PopFront(pSeqList ps);//头部删除数据
int Find(pSeqList ps, DataType d);//删除指定位置的数据
void Insert(pSeqList ps, DataType d, int pos);//在指定的位置插入数据
void Remove(pSeqList ps, DataType d);//删除数据d
void RemoveAll(pSeqList ps, DataType d);//删除所有相同的数据d
void Reverse(pSeqList ps);//将所有数据逆序
void Sort(pSeqList ps);//给所有数据排序
int BinarySearch(pSeqList ps, DataType d);//二分查找指定数据
#endif//__SeqList_H__ 
Seqlist.c

#include"Seqlist.h"
void InitSeqList(pSeqList ps)
{
	assert(ps != NULL);
	ps->sz = 0;
	ps->data = malloc(sizeof(DataType)*Orgin_capacity);
	//ps->sz = 0;
	if (ps->data == NULL)
	{
		perror("use malloc");
		exit(EXIT_FAILURE);
	}
	memset(ps->data, 0, sizeof(DataType)*Orgin_capacity);
	ps->capacity = Orgin_capacity;
}

void CheckSeqList(pSeqList ps)
{
	assert(ps != NULL);
	if (ps->capacity==ps->sz)
	{
		DataType *ptr = (DataType*)realloc(ps->data, (sizeof(DataType))*(ps->capacity + Expand_INC));
		if (ptr == NULL)
		{
			perror("use realloc");
			exit(EXIT_FAILURE);
		}
		else
		{
			ps->data = ptr;
		}
		ps->capacity += Expand_INC;
		printf("增容成功!\n");
	}
}

void DestorySeqList(pSeqList ps)
{
	assert(ps);
	free(ps->data);
	ps->sz = 0;
	ps->capacity = 0;
}

void DisPlay(pSeqList ps)
{
	int i= 0;
	assert(ps != NULL);
	if (ps->sz == 0)
	{
		return;
	}
	for (i = 0; i < ps->sz; i++)
	{
		printf(PrintType, ps->data[i]);
	}
	printf("\n");
}

void PushBack(pSeqList ps, DataType d)
{
	assert(ps != NULL);
	CheckSeqList(ps);

	ps->data[ps->sz] = d;
	ps->sz++;

	/*if (ps->sz == MAX)
	{
		return;
	}
	else*/
	///{
		ps->data[ps->sz] = d;
		ps->sz++;
	//}
}

void PushFront(pSeqList ps, DataType d)
{
	int i = 0;
	assert(ps != NULL);
	CheckSeqList(ps);
	/*if (ps->sz == MAX)
	{
		return;
	}*/
	for (i = ps->sz-1; i >= 0; i--)
	{
		ps->data[i+1] = ps->data[i];
	}
	ps->data[0] = d;
	ps->sz++;
}

void PopBack(pSeqList ps)
{
	assert(ps != NULL);
	if (ps->sz == 0)
	{
		return;
	}
	ps->sz--;
}

void PopFront(pSeqList ps)
{
	assert(ps);

	memmove(ps->data , ps->data+1, (ps->sz - 1)*sizeof(DataType));
	ps->sz--;
}

int Find(pSeqList ps, DataType d)
{
	int i = 0;
	assert(ps != NULL);
	

	for (i = 0; i < ps->sz; i++)
	{
		if (ps->data[i] == d)
		{
			return i;
		}
		
	}
	return -1;
}

void Insert(pSeqList ps, DataType d,int pos)
{
	assert(ps != NULL);
	CheckSeqList(ps);
	/*if (ps->sz == MAX)
	{
		return;
	}*/
	memmove(ps->data + pos + 1, ps->data + pos, (ps->sz - pos)*sizeof(DataType));
	ps->data[pos] = d;
	ps->sz++;
}

void Remove(pSeqList ps, DataType d)
{
	int pos = 0;
	assert(ps != NULL);
	if (ps->sz == 0)
	{
		return;
	}
    pos = Find(ps, d);
	if (pos != -1)
	{
		memmove(ps->data + pos, ps->data + pos+1, sizeof(DataType)*(ps->sz - pos - 1));
		ps->sz--;
	}
}

void RemoveAll(pSeqList ps, DataType d)
{
	int i = 0;
	assert(ps != NULL);
	if (ps->sz == 0)
	{
		return;
	}
	while ((Find(ps, d)) != -1)
	{	memmove(ps->data + i, ps->data + i + 1, sizeof(DataType)*(ps->sz - i));
			ps->sz--;
	}
}

void Reverse(pSeqList ps)
{
	int left = 0;
	int right = ps->sz - 1;
	assert(ps);
	if (ps->sz == 0)
	{
		return;
	}
	while (left < right)
	{
		int tmp = ps->data[left];
		ps->data[left] = ps->data[right];
		ps->data[right] = tmp;
		left++;
		right--;
	}
}

void Sort(pSeqList ps)
{
	int i = 0;
	int j = 0;
	assert(ps);
	if (ps->sz == 0)
	{
		return;
	}
	for (i = 0; i < ps->sz-1; i++)
	{
		for (j = 0; j < (ps->sz - i - 1); j++)
		{
			if (ps->data[j]>ps->data[j + 1])
			{
				DataType tmp = ps->data[j];
				ps->data[j] = ps->data[j + 1];
				ps->data[j + 1] = tmp;
			}
		}
	}
}

int BinarySearch(pSeqList ps, DataType d)
{
	int left = 0;
	int right = ps->sz - 1;
	int mid = left + ((right - left) >> 2);
	while (left <= right)
	{
		if (ps->data[mid] == d)
			return mid;
		else if (ps->data[mid] > d)
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
	}
	return -1;
}
test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"Seqlist.h"

void test1()
{
	SeqList my_list;
        InitSeqList(&my_list);
	PushBack(&my_list,1);
	PushBack(&my_list,2);
	/*PushBack(&my_list,3);
	PushBack(&my_list,4);*/
        DisPlay(&my_list);
	PushFront(&my_list, 5);
	PushFront(&my_list, 6);
	/*PushFront(&my_list, 7);
	PushFront(&my_list, 8);*/
	DisPlay(&my_list);
	PopBack(&my_list);
	DisPlay(&my_list);
	PopFront(&my_list);
	DisPlay(&my_list);
}

void test2()
{
	SeqList my_list;
	InitSeqList(&my_list);
	PushBack(&my_list, 1);
	PushBack(&my_list, 2);
	DisPlay(&my_list);
	PushBack(&my_list, 3);
	PushBack(&my_list, 4);
	DisPlay(&my_list);
	PushFront(&my_list, 5);
	PushFront(&my_list, 6);
	DisPlay(&my_list);
	PushFront(&my_list, 7);
	PushFront(&my_list, 8);
	DisPlay(&my_list);
	PopBack(&my_list);
	DisPlay(&my_list);
	PopFront(&my_list);
	DisPlay(&my_list);
	int pos = Find(&my_list, 3);//查找  
	printf("要寻找的下标为:%d \n", pos);
	DisPlay(&my_list);
    Insert(&my_list, 6, 2);
	DisPlay(&my_list);
	Remove(&my_list,3);
    DisPlay(&my_list);
	Remove(&my_list, 7);
	DisPlay(&my_list);
	Sort(&my_list);
	DisPlay(&my_list);
	int mid = BinarySearch(&my_list, 2);
	printf("二分法查找要寻找的下标为:%d \n", mid);
	DisPlay(&my_list);
	Reverse(&my_list);
	DisPlay(&my_list);
	RemoveAll(&my_list, 6);
	DisPlay(&my_list);
	Remove(&my_list, 5);
	DisPlay(&my_list);
	//DestorySeqList(&my_list);
}
    

int main()
{
	SeqList my_list;
	InitSeqList(&my_list);
	//test1();
	test2();
	DestorySeqList(&my_list);
	system("pause");
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的动态顺序表实现,包括插入、删除、查找、遍历等基本操作: ```c #include <stdio.h> #include <stdlib.h> #define INIT_CAPACITY 10 // 初始容量 #define INCREMENT 5 // 每次扩容增加的容量 typedef struct { int *data; // 数据 int length; // 当前长度 int capacity; // 当前容量 } SeqList; // 初始化顺序表 void init(SeqList *list) { list->data = (int*)malloc(INIT_CAPACITY * sizeof(int)); list->length = 0; list->capacity = INIT_CAPACITY; } // 扩容 void expand(SeqList *list) { list->capacity += INCREMENT; list->data = (int*)realloc(list->data, list->capacity * sizeof(int)); } // 插入元素 void insert(SeqList *list, int index, int value) { if (index < 0 || index > list->length) { printf("Index out of bounds\n"); return; } if (list->length == list->capacity) { expand(list); } for (int i = list->length - 1; i >= index; i--) { list->data[i+1] = list->data[i]; } list->data[index] = value; list->length++; } // 删除元素 void remove(SeqList *list, int index) { if (index < 0 || index >= list->length) { printf("Index out of bounds\n"); return; } for (int i = index; i < list->length - 1; i++) { list->data[i] = list->data[i+1]; } list->length--; } // 查找元素 int find(SeqList *list, int value) { for (int i = 0; i < list->length; i++) { if (list->data[i] == value) { return i; } } return -1; } // 遍历顺序表 void traverse(SeqList *list) { for (int i = 0; i < list->length; i++) { printf("%d ", list->data[i]); } printf("\n"); } int main() { SeqList list; init(&list); insert(&list, 0, 1); insert(&list, 0, 2); insert(&list, 2, 3); remove(&list, 1); traverse(&list); return 0; } ``` 在这个实现中,顺序表的容量会在需要时自动扩容,每次扩容增加的容量为 `INCREMENT`。可以根据实际需求修改这个值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值