C语言的大BOSS:结构体+单链表的学习体会

1.结构体:
本质上是一种在已有基本数据类型上复合而成的数据类型,它可以像int、float等类型一样使用(可以生成对象、指针、数组等)。
注意结构体与结构体变量的区分:
如:
struct Student
{
int a;
int b;
}Stu, Stu[10], *p;
Stu, Stu[10], p都是结构体变量(分别为结构体变量、结构体数组、结构体指针)
而Student则是结构体,与int地位等同。

2.数组与链表:
前者是连续的一块存储空间,后者是一般不连续的存储空间。需要遍历、排序时,他们的算法从广义上来说是一致的,但在具体实现上有所区别。
例如在冒泡排序时,前者利用 i,j起到计数和索引两个作用;而后者则可用i、j单独起计数作用,并定义结构体指针p和q来进行索引操作。主要原因还是两种数据存储方式的连续与不连续的区别。

3.关于指针与数组
int a[10] = {1,2,3,4,5,6,7,8,9,10};
for (int i=0; i<10; i++)
{
cout << a[i];
}
a是数组的首地址,而指针本质上也是地址,因此
a[i]这种表达方式可以等价为 *(a+i)

在用结构体写一个简易的学生信息管理系统的时候

    //构造动态一维数组来存放学生信息
    pArr = (struct Student *)malloc(len * sizeof(struct Student));
    //类比一下:
    //pArr = (int *)malloc(len * sizeof(int));
    //这条语句实质上在内存里建立了len个大小为int大小(4个字节)
    //即len*4个字节的空间,并形成一个数组;
    //而换成结构体类型后,也就相当于建立了能够容纳len个
    //结构体对象的数组。pArr正是数组的首地址,pArr[i]
    //可用于遍历。
    //能够这样的原因:
    //使用malloc分配的内存空间在虚拟地址空间上是连续的。

    //输入,要用循环
    for (int i=0; i<len; i++)
    {
        printf("Please enter the %dth 
        student's information:\n", i+1);
        printf("age = ");
        scanf("%d", &pArr[i].age);
        printf("score = ");
        scanf("%f", &pArr[i].score);
        printf("name = ");
        scanf("%s", pArr[i].name);
    }

4.广义、狭义算法与泛型
冒泡法作为一种思路,用在链表的排序和用在数组的排序写出来的代码不相同(或者说具体的实现不同)。从这种意义上来讲,冒泡法这种思路是一种广义算法,但是具体的某种实现可以说是一种狭义算法。
我说理解的泛型是一种泛化的、广义化的抽象,比如数组、链表都抽象成容器,从而达到更高层次的统一。
比如数组的i++遍历和链表的p=p->pNext遍历看起来是不一样的,但利用C++重载后赋予++符号新的含义用来表示p=p->pNext,则两者就统一起来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值