SWUST OJ 943

一、题目

题目描述

建立长度为n的顺序表,在指定的数据元素item之前插入数据元素data。如果指定的数据元素item不存在,则将data插入到顺序表的尾端。(数据类型为整型)

输入
第一行为顺序表的长度n;
第二行为顺序表中的数据元素;
第三行为指定的数据元素item;
第四行为要插入的数据元素data;
输出
输出结果为顺序表中的数据元素。
样例输入
10
10 20 30 40 50 60 70 80 90 100
50
55
样例输出
10 20 30 40 55 50 60 70 80 90 100

 二、代码

采用动态分配

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


//建立长度为n的线性表,n不确定,且要进行插入操作,采用动态分配的方式


struct Seqlist{
	int* data; 
	int maxsize; //最大容量 
	int length; //当前长度 
};

void initlist(struct Seqlist &L,int n){
	L.data = (int*)malloc(sizeof(int)*(n+1));
	L.length = n; //表示现在数组有几个元素,题目里的n就为元素数目 
	L.maxsize = n + 1; //省得后面增加数组长度了 
}


//动态增加数组长度 
//void IncreaseSize(Seqlist &L,int len){
//	int *p = L.data;
//	L.data = (int*)malloc(sizeof(int)*(L.Maxsize + len)); //顺序表是占据连续的一段存储空间,因此增加长度要重新分配空间 
//	for(int i = 0;i<L.length;i++){
//		L.data[i] = p[i];
//	}
//	L.Maxsize +=len;
//	free(p);
//}


void insertlist(struct Seqlist &L,int data,int item){
	// IncreaseSize(L,1);    maxsize已经设置为了n + 1,就不用再调用增加数组长度的函数了 
	int m = -1; //用来记录item的数组下标 
	for(int i = 0;i<L.length;i++){
		if(L.data[i] == item){
			m = i;
		} 	
	} 
	if(m == -1){  //此时L中没有item这个元素 
		L.data[L.length] = data; 
	}
	else{
		for(int i = L.length;i>m;i--){
			L.data[i] = L.data[i-1]; //元素整体后移一位 
		}
		L.data[m] = data;
		L.length++;
	} 
	
} 


int main(){
	int n = 0; //顺序表长度 
	scanf("%d",&n);
	struct Seqlist L;
	initlist(L,n);
//录入数据到顺序表 
	for(int i =0;i<n;i++){
		int input_data;
		scanf("%d",&input_data);
		L.data[i] = input_data;
	} 
	int item = 0;
	scanf("%d",&item);
	int data = 0;
	scanf("%d",&data);
	insertlist(L,data,item);
//打印结果
	for(int i =0;i<=n;i++){
		printf("%d ",L.data[i]);
	}

	return 0;
}

三、小结

1.如果单纯做题,那完全可以用静态分配来写题目,刚开始就分配一个较大的数,也能应付例子,写起来也简单。

静态分配

#include<stdio.h>
#define Maxsize 10

struct Sqlist{
	int data[Maxsize];
	int length;
};

void Initlist(struct Sqlist &L){
	//可以设置data的初值,也可以不设置,因为一般合法的访问不会访问到length之外的元素,而length初始化时为0;
	/*
	for(int i = 0;i<Maxsize;i++){
		data[i] = 0;
	} 
	*/ 
	L.length = 0;
}

静态分配本质上其实就是一个数组,大小一开始就是固定的了。

2.顺序表与单链表的某些区别

顺序表区别于单链表的一个地方就是存储上,单链表增加空间,直接申请就好了,只要能正确的链接上就可以,但顺序表就需要连续的一段空间,因此动态分配进行扩展的时候需要先拷贝数据到一个暂时的地方,然后重新申请空间,再拷贝回来,时间复杂度大。

3.顺序表特点

1.随机访问,即可以直接访问第i个元素

2.访存密度高

3.拓展容量不方便

4.插入删除不方便

好像用C++的STL库写很方便,但学都学了,就敲一敲吧~

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值