顺序表动态两元素之间的插入
今天是3.7
#include<stdlib.h>
#include<stdio.h>
struct node{
int *elem;//创建指针
int length;
//长度
};
/*一开始设的类型是node*,返回只怎么弄都不对。这是一个顺序表,不是链表,不需要返回地址,因为它的地址不改变。*/
int charu(node *l,int i,int j){ //l是指针,要指向
if(i<0||i>l->length+1){ //判断范围,如果插入的范围不在1~length+1中就插不了
return 0;
}
if(l->length>=10){ //如果原本的长度已经占满
`int *newbase=(int *)realloc(l->elem,15*sizeof(int));*` 在这里插入代码片//使用realloc在开一个新的空间*
`if(!newbase)`//这个空间没开好,没开好就是空,非空为真
return 0;
l->elem=newbase;//把原来的指针在指向开好的空间
l->length+=5;
//长度要记得加
}
int *p,*q;
p=&(l->elem[l->length-1]); //p是这个空间最后一个元素
q=&(l->elem[i-1]);
/ /q是要插入的元素位置,位置-1是元素下标
for(p;p>=q;p--){ /*顺序表中指针可减,连续的空间。插入就是把最后一个元素往后挪,再把前一个位置往后挪到以前最后一个位置,最后会在要插入的位置上空出来。*/
*(p+1)=*p;//把前一个元素交给后一个元素,指针加*是它的值
}
*q=j;//把要插入的值给了要插入的位置
l->length++;//长度要加1
return 1;//对了就返回一
}
int main(void){
node l;//创建一个结构体变量
l.elem=(int *)malloc(10*sizeof(int));//给变量开辟10*4B个空间
int i;
for(i=0;i<5;i++){//赋值
l.elem[i]=i+1;
}
printf("原始数据\n");
for(i=0;i<5;i++){
printf("%d\t",l.elem[i]);
}
printf("\n");
charu(&l,2,123);//l是地址,要把地址传给函数,l要有变化。在第二个位置上插入123
printf("插入后的数据\n");
for(i=0;i<6;i++){
printf("%d\t",l.elem[i]);
}
}