数据结构 1-1 顺序表 例题

顺序表

题目:
在这里插入图片描述

代码片段:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
// 定义符号常量
#define LIST_INIT_SIZE 50
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
 
// 定义元素类型
typedef int ElemType;
typedef int Status;
typedef int LElemType_Sq;

// 定义顺序表类型
typedef struct {
    ElemType *elem; // 顺序表元素
    int length;     // 顺序表长度
    int listsize;   // 顺序表存储容量
} SqList;

//初始化一个顺序表 
Status InitList_Sq(SqList *L)	
{
	(*L).elem = (LElemType_Sq*)malloc(LIST_INIT_SIZE*sizeof(LElemType_Sq));
	if(!(*L).elem)
		exit(OVERFLOW); 				//分配内存失败

	(*L).length = 0;					//初始化顺序表长度为0
	(*L).listsize = LIST_INIT_SIZE;		//顺序表初始内存分配量
	printf("yes\n");	
	return OK;							//初始化成功
 
} 

//在顺序表L的第i个位插入元素e 
Status ListInsert_Sq(SqList *L, int i, LElemType_Sq e)		
{
	LElemType_Sq *newbase; 
	LElemType_Sq *p, *q;

	if(i<1 || i>(*L).length+1)
		return ERROR;					//i值不合法

	if((*L).length >= (*L).listsize)	//若存储空间已满,需开辟新空间 
	{
		newbase = (LElemType_Sq*)realloc((*L).elem, ((*L).listsize+LISTINCREMENT)*sizeof(LElemType_Sq));
		if(!newbase)
			exit(OVERFLOW);

		(*L).elem = newbase;
		(*L).listsize += LISTINCREMENT;
	}
	
	q = &(*L).elem[i-1];				//q为插入位置 
	
	for(p=&(*L).elem[(*L).length-1]; p>=q; --p)
		*(p+1) = *p;					//插入位置及之后的元素右移 
	
	*q = e;								//插入e 
	(*L).length++;						//表长增1

	return OK; 
}

void Visit(LElemType_Sq x)
{
	printf("%d ",x);	
}

//遍历一个顺序表 
Status ListTraverse_Sq(SqList L)
{
	int i;

	for(i=0; i<L.length; i++)
		Visit(L.elem[i]); 
	printf("\n");
	return OK;
}

//比较并插入值 
Status ListInsertAfterCompare(SqList &L,LElemType_Sq x){
	int pos=0;//记录顺序表中 x应该插入的位置 
	for(int i=0;i<L.length;i++)
	{
		if(L.elem[i]>=x)	//如果顺序表中轮到的元素比x还要大,则x应该插在这个元素的前面 
		{
			pos=i+1; 
			ListInsert_Sq(&L,pos,x);
			break;
		}
		else if(i==L.length-1)	//此时x大于所有顺序表内元素,直接插在表尾即可 
			{
				ListInsert_Sq(&L,L.length+1,x);	
				break;
			} 
	}
}


int main()
{
		SqList l1;								//初始化一个表的数据结构叫l1 
		InitList_Sq(&l1);						//为l1分配空间 初始化 
		
		for(int i=1;i<20;i++)					
		{
			ListInsert_Sq(&l1,i,i*2);			//为表输入递增的元素(这里是随便弄了一串,也可以自己输入一串) 
		}
		
		ListTraverse_Sq(l1);					//按顺序输出表
		 
		int x;
		scanf("%d",&x);							//读取输入的值记为x 即待插入的值 
		
		ListInsertAfterCompare(l1,x);			//在顺序表中比较后插入 
		ListTraverse_Sq(l1);					//再次输出插入后的顺序表 
		 
}

结果:在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值