C语言-顺序表的动态分配
关于顺序表的增删改
1、有返回值函数
#include<stdio.h>
#include<stdlib.h>
// 一般线性表的顺序查找
typedef struct{
int *data;
int size,length;
}SeqList;
// 初始化
SeqList InitList(SeqList L)
{
L.data = (int *)malloc(sizeof(int)*10);
L.length = 0;
L.size = 10;
return L;
}
// 存入数据
SeqList Insert(SeqList L)
{
printf("请输入值:");
for(int i = 0;i < L.size;i++)
{
printf("data[%d]:",i);
scanf("%d",&L.data[i]);
L.length++;
}
return L;
}
// 打印数据
SeqList Print(SeqList L)
{
for(int i = 0;i < L.size;i++)
{
printf("data[%d]:",i);
printf("%d",L.data[i]);
printf(" ");
}
return L;
}
// 删除数据
SeqList Del(SeqList L,int a){
int h = 0;
for(int i = 0;i <= L.length;i++){
if(L.data[i] == a){
h = i;
while(h < L.length){
L.data[h] = L.data[h + 1];
h++;
}
L.length--;
}
}
return L;
}
int main()
{
SeqList L;
L = InitList(L);
L = Insert(L);
L = Del(L,5);
L = Print(L);
return 0;
}
2、没有返回值函数
#include<stdio.h>
#include<stdlib.h>
// 一般线性表的顺序查找
typedef struct{
int *data;
int size,length;
}SeqList;
// 初始化
int InitList(SeqList *L)
{
L->data = (int *)malloc(sizeof(int)*10);
L->length = 0;
L->size = 10;
return 0;
}
// 存入数据
int Insert(SeqList *L)
{
printf("请输入值:");
for(int i = 0;i < L->size;i++)
{
printf("data[%d]:",i);
scanf("%d",&L->data[i]);
L->length++;
}
return 0;
}
// 打印数据
int Print(SeqList *L)
{
for(int i = 0;i < L->size;i++)
{
printf("data[%d]:",i);
printf("%d",L->data[i]);
printf(" ");
}
return 0;
}
int main()
{
SeqList L;
InitList(&L);
Insert(&L);
Print(&L);
return 0;
}
总结:关于顺序表的动态分配问题,存在以下几点:
(1)顺序表在定义结构体变量的时候要注意,SeqList后面没有*
(2)在main中新定义的函数的实际参数要根据上面代码的形式参数相对应。
如果上边定义为int Print(SeqList *L),那么在调用的时候为Print(&L),且使用->来访问结构体中的各个元素。
如果上边定义为SeqList Print(SeqList L),那么在调用的时候为Print(L),且使用.来访问结构体中的各个元素,访问函数结束后要用return进行返回,否则原来创建好的结构体将不会发生任何改变。
(3)在定义顺序表的过程中,要注意以下两种方式是差不多的。(还是有细微的区别)。重点关注typedef的使用
typedef struct{
}SeqList;
上面这种方法在main中定义的时候为SeqList L;
上面这种方法在定义函数时候形式参数为int Print(struct SeqList L),当然用L还是L和这两种定义方式没有什么关系
struct SeqList{
};
上面这种方法在main中定义的时候为struct SeqList L;
上面这种方法在定义函数时候形式参数为int Print(SeqList L),当然用L还是L和这两种定义方式没有什么关系