《数据结构题集》严蔚敏 2.11

本文深入探讨了在有序列表中插入元素的算法实现,详细解释了如何通过动态内存分配和元素比较来保持列表的有序性。文章提供了完整的C语言代码示例,包括列表初始化、元素插入、按序插入及遍历等功能,适用于初学者理解动态数据结构操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有效代码: int InsertListOrder(List * L,int e);

int 
InsertListOrder(List * L,int e)
{
	int * newbase;
	int i;
	if( (*L).length > (*L).size)
	{
		newbase = (int *)realloc((*L).elem, (LISTINCREMENT + (*L).size ) * sizeof(int));
		if(!newbase)
			exit(ERROR);
		(*L).elem = newbase;
		(*L).size = LISTINCREMENT + (*L).size;
	}
	for(i = (*L).length;i>=1;i--)
	{
		if((*L).elem[i-1] > e)
			(*L).elem[i] = (*L).elem[i-1];
		else 
			break;
	}	
	//虽然是用指针来代替静态数组,但还是可以用数组这个形式滴
	(*L).elem[i] = e;

    ++ (*L).length;
   return OK;
}

全部代码:

#include<stdio.h>
#include<stdlib.h>

#define ERROR -1
#define OK 1

#define LIST_INT_SIZE 100
#define LISTINCREMENT 10


typedef struct 
{
	int * elem;
	int length;
	int size;
	
}List;


int
InitList(List *L)
{
	(*L).elem = (int *)malloc(LIST_INT_SIZE * sizeof(int));
	if(!(*L).elem)
		exit(ERROR);
	(*L).length = 0;
	(*L).size = LIST_INT_SIZE;
	return OK;
}

int 
InsertList(List * L,int i,int e)
{
	int * newbase,*q,*p;
	//int list1[5] = {3,5,7,9,11};
	if(i<1 || i>(*L).length+1)
		return ERROR;
	if( (*L).length > (*L).size)
	{
		newbase = (int *)realloc((*L).elem, (LISTINCREMENT + (*L).size ) * sizeof(int));
		if(!newbase)
			exit(ERROR);
		(*L).elem = newbase;
		(*L).size = LISTINCREMENT + (*L).size;
	}
	
	q = (*L).elem + i -1;


	//也就是插入点后面的元素都要往后挪一位

	for( p = (*L).elem + (*L).length-1 ;p>=q;--p)
	{
		*(p+1) = *p;

	}
	*q = e;

    ++ (*L).length;

	return OK;


}

int 
InsertListOrder(List * L,int e)
{
	int * newbase;
	//int list1[5] = {3,5,7,9,11};
	//how to insert?

	int i;

	if( (*L).length > (*L).size)
	{
		newbase = (int *)realloc((*L).elem, (LISTINCREMENT + (*L).size ) * sizeof(int));
		if(!newbase)
			exit(ERROR);
		(*L).elem = newbase;
		(*L).size = LISTINCREMENT + (*L).size;
	}

	for(i = (*L).length;i>=1;i--)
	{
		if((*L).elem[i-1] > e)
			(*L).elem[i] = (*L).elem[i-1];
		else 
			break;
	}

	
	//虽然是用指针来代替静态数组,但还是可以用数组这个形式滴
	(*L).elem[i] = e;

    ++ (*L).length;

	return OK;

}

int
define_create(List *L,int n)
{
	int i,j;
	int e;
	InitList(L);
	printf("please enter %d elements: ",n);
	scanf("%d",&e);
	InsertList(L,1,e);//if don't write like this divided,we can't get the result.
	for(i = 1;i<n;i++) //modify
	{
		scanf("%d",&e);

		for(j = 0;j<(*L).length;j++)
		 	if(e <= *((*L).elem + j) )
		 		break;      
	    InsertList(L,j+1,e);   //like this add order

	}

	return OK;
}

void
ListTraverse(List L,void(*visit)(int *))
{
	int * q;
	q = L.elem;

	//for(;(q ++)!= NULL;)
	for(int i = 1;i<=L.length;i++)
	{
		visit(q++);
	}

	printf("\n");

}

void visit(int * c)
{
	printf(" %d ", *c );
}


int main(int argc, char const *argv[])
{
	int n;
	List L;
	//why can't use List *
	InitList(&L);

	printf("please enter the List  number: ");
	scanf("%d",&n);
	define_create(&L,n);

	InsertListOrder(&L,5);

	ListTraverse(L,visit);

	

	return 0;
}

运行截图:

仅供参考1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。 解:数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 数据对象是性质相同的数据元素的合,是数据的一个子数据结构是相互之间存在一种或多种特定关系的数据元素的合。 存储结构是数据结构在计算机中的表示。 数据类型是一个值的合和定义在这个值上的一组操作的总称。 抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。是对一般数据类型的扩展。 1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。 解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。抽象数据类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。 1.3 设有数据结构(D,R),其中 , , 试按图论中图的画法惯例画出其逻辑结构图。 解: 1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。 解: ADT Complex{ 数据对象:D={r,i|r,i为实数} 数据关系:R={<r,i>} 基本操作: InitComplex(&C,re,im) 操作结果:构造一个复数C,其实部和虚部分别为re和im DestroyCmoplex(&C) 操作结果:销毁复数C Get(C,k,&e) 操作结果:用e返回复数C的第k元的值 Put(&C,k,e) 操作结果:改变复数C的第k元的值为e IsAscending(C) 操作结果:如果复数C的两个元素按升序排列,则返回1,否则返回0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月的天气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值