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


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

    问题描述

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

    顺序表的基本运算如下:

    (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;
    }
    
    欢迎评论交流!
  • 相关阅读:
    Entity Framework 第十篇 条件查询
    Entity Framework 第九篇 关于自增列的事务处理
    Entity Framework 第八篇 结构优化
    Entity Framework 第七篇 简化排序
    控件截图Cache
    Java基础_自加运算
    Java基础_赋值运算
    Java基础_字符与字符串的运算
    同步和异步
    Application中的name属性
  • 原文地址:https://www.cnblogs.com/alking1001/p/11796422.html
Copyright © 2020-2023  润新知