要注意的点:struct里面int*,因为(我写的代码)elem作为数组名是一个指针。
还有增加删除的逻辑处理。
/*顺序表(结构体)数组的创建,增加,删除*/
#include<stdio.h>
#include<stdlib.h>
#define MAX 50
typedef struct node{
int *elem;
int len;
int maxlen;
}Node;
Node* create(Node *L); //创建数组
Node* add(Node *L); //在第i位加元素
Node* del(Node *L); //删除第i位元素
void print(Node *L);
int main()
{
Node *L;
L=create(L); //创造有n个元素的数组
printf("\n创造的数组为:");
print(L);
L=add(L);
printf("\n添加后的数组为:");
print(L);
L=del(L);
printf("\n删除后的数组为:");
print(L);
return 0;
}
Node* create(Node *L)
{
int i=0,n=0;
printf("请输入n(n为数组个数)");
scanf("%d",&n);
L=(Node*)malloc(sizeof(Node)*MAX); //一次性申请完空间【数组就是这个原理】
for(i=0;i<n;i++){
printf("\n第%d个元素",i);
scanf("%d",&(L->elem[i]));
}
L->len=n;
return L;
}
Node* add(Node *L)
{
Node *newnode;
int x=0,n=0;
int i=0,j=0;
printf("\n请输入要增加的位置n以及增加的元素x:");
scanf("%d %d",&n,&x);
if(L->len<=0&&L->len>MAX){
printf("\n n is invalid!!");
exit(0);
}
if(L->len==L->maxlen){ //表满的操作
newnode=(Node*)realloc(L,sizeof(Node)*5);//realloc重新分配空间,不改变首地址
if(!newnode){
printf("\n分配空间失败。");
exit(0);
}
L=newnode;
L->maxlen+=5;
}else{
for(i=L->len;i>=n;i--){
L->elem[i]=L->elem[i-1];
}
L->elem[n-1]=x;
L->len++;
}
return L;
}
Node* del(Node *L)
{
int n=0,j=0;
printf("\n请输入要删除的位置:");
scanf("%d",&n);
for(j=n;j<L->len;j++){
L->elem[j-1]=L->elem[j];
}
L->len--;
return L;
}
void print(Node *L)
{
printf("\n");
int i=0;
for(i=0;i<L->len;i++){
printf("%d ",L->elem[i]);
}
}