顺序表的各种操作 数据结构

实现顺序表的各种操作 数据结构

问题描述

实现顺序表各种基本运算的算法】该算法的设计,要求运行结果如下所示:(这里的元素使用数字代替,数字的生成使用随机函数来实现)

顺序表的基本运算如下:

(1)初始化顺序表L

(2)依次插入a,b,c,d,e元素

(3)输出顺序表L:a b c d e

(4)顺序表L长度:5

(5)顺序表L为非空

(6)顺序表L的第3个元素:c

(7)元素a的位置:1

(8)在第4个元素位置上插入f元素

(9)输出顺序表L:a b c f d e

(10)删除L的第3个元素

(11)输出顺序表L:a b f d e

(12)释放顺序表L

/*
	产生n个[min, max]的随机数。可能会有重复值。
*/
void initRandomize(int *arr, int n, int min, int max)
{
    int i = 0;
    srand(time(0));  			/*设置种子,并生成伪随机序列*/
    for (i = 0; i < n; ++i) {
        arr[i] = rand() % (max - min + 1) + min;  /*得到从[min, max]之间的随机数*/
        printf("%d ", arr[i]);
    }
    printf("

");
}

代码实现

#include<bits/stdc++.h>
using namespace std;
const int init_size=10;
const int increment=5;
struct sqlink
{
	int *elem;
	int len;
	int listsize;
};
bool init(sqlink &L)
{
	L.elem=(int *)malloc(init_size*sizeof(int));
	if(L.elem==NULL)
		return false;
	L.len=0;
	L.listsize=init_size;
	return true;
}
bool listinsert(sqlink &L, int i, int e)
{
	int *newbase, *p;
	if(i<1 || i>L.len+1)
		return false;
	if(L.len >= L.listsize)
	{
		newbase=(int *)realloc(L.elem, (L.listsize+increment)*sizeof(int));
		if(newbase==NULL)
			return false;
		//printf("链表扩容一次
");
		L.elem=newbase;
		L.listsize+=increment;
	} 
	for(p=&(L.elem[L.len-1]); p>=&(L.elem[i-1]); p--) 
		*(p+1)=*p;
	L.elem[i-1]=e;
	L.len++;
	return true;
}
bool del(sqlink &L, int i, int &e)
{
	int *p;
	if(i<1 || i>L.len)
		return false;
	e=L.elem[i-1];
	for(p=&(L.elem[i]); p<=&(L.elem[L.len-1]); p++)
		*(p-1)=*p;
	L.len--;
	return true;
}
bool isempty(sqlink &L)
{
	if(L.len!=0)
		return false;
	else return true;
}
int list_size(sqlink &L)
{
	return L.len;
}
bool display(sqlink &L)
{
	int i;
	for(i=0; i<L.len; i++)
	{
		printf("%d ", L.elem[i]);
	}
	printf("

");
	return true;
}
bool getdata(sqlink &L, int i, int &e)
{
	if(i<1 || i>L.len)
		return false;
	e=L.elem[i-1];	
	return true;
}
bool find(sqlink &L, int x, int &e)
{
	int i;
	for(i=0; i<L.len; i++)
	{
		if(L.elem[i]==x)
		{
			e=i+1;
			return true;
		}
	}
	return false;
}
bool clear(sqlink &L)
{
	if(L.elem==NULL)
		return false;
	free(L.elem);
	L.elem=NULL;
	L.len=0;
	L.listsize=0;
	return true;
}
/*
	产生n个[min, max]的随机数。可能会有重复值。
*/
void initRandomize(int *arr, int n, int min, int max)
{
    int i = 0;
    srand(time(0));  			/*设置种子,并生成伪随机序列*/
    for (i = 0; i < n; ++i) {
        arr[i] = rand() % (max - min + 1) + min;  /*得到从[min, max]之间的随机数*/
        printf("%d ", arr[i]);
    }
    printf("

");
}

int main()
{
	int a[10], maxx=20, minn=1, i, e, tmp;
	sqlink L;
	if(!init(L))
	{
		printf("链表初始化出现错误,程序退出
");
		return 0;
	}
	initRandomize(a, 5, 0, 10);
	for(i=0; i<5; i++)
	{
		if(!listinsert(L, i+1, a[i]))
		{
			printf("链表插入出现错误, 链表结束插入操作
");
			break;
		}
	}
	if(!display(L))
		printf("链表为空,没有输出
");
	printf("该链表中一共有%d个元素
", list_size(L));
	printf("%s
", isempty(L)? "该链表为空
":"该链表非空
");
	if(getdata(L, 3, e))
		printf("链表的第三个元素是%d
", e);	
	else
		printf("获取链表中的元素出现错误
");
	if(find(L, a[0], e))
		printf("元素%d的位置是%d
", a[0], e);
	else 
		printf("链表中没有这个元素
");
	printf("输入要在第四个位置上插入的元素:");
	scanf("%d", &tmp);
	if(listinsert(L, 4, tmp))
		printf("插入成功
");
	else 	
		printf("插入失败
");
	if(!display(L))
		printf("链表为空,没有输出
");
	if(del(L, 3, e))
		printf("删除第三个元素成功
");
	else 
		printf("删除第三个元素失败
");
	if(!display(L))
		printf("链表为空,没有输出
");
	if(!clear(L))
		printf("free失败
");
	else printf("free成功
");
	return 0;
}
欢迎评论交流!
原文地址:https://www.cnblogs.com/alking1001/p/11796422.html