一、题目
题目描述
建立长度为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库写很方便,但学都学了,就敲一敲吧~