额外篇

欢迎使用C语言

链表概述

链表是一种常见的数据结构。它是动态地进行存储分配的一种结构。
链表有一个头指针变量,它存放一个地址,该地址指向一个元素,链表中每一个元素称为结点,每个结点都应包括两个部分,一为用户需要用的实际数据,二为下一个结点的地址。可以看出,头指针head指向第一个元素,第一个元素又指向第二个元素,…知道最后一个元素,该元素不再指向其他元素,它称为表尾,它的地址部分放一个NULL(表示空地址)链表到此结束。
可以看到链表中各元素在内存中可以不连续存放的,要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一个元素。如果不提供头指针head则整个链表无法访问。
这种链表的数据结构,必须利用指针变量才能实现,即一个节点应包含一个指针变量,用它存放下一节点的地址。
结构体变量,用它作链表中的节点是最合适的,一个结构体变量包含若干成员,这些成员可以是数据类型,字符类型,数组类型,也可以是指针类型,用这个指针成员来存放下一个结点的地址。
函数指针变量的声明:

typedef int (*fun_ptr)(int,int);//声明一个指向同样参数、返回值的函数指针类型

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
类型 *变量名;
type是指针的基类型,它必须是一个有效的C数据类型。var-name是指针变量的名称。用来声明的星号 *与乘法中使用的星号是相同的。在这个语句中,星号是用来指定一个变量是指针。
所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数
不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

#include<stdio.h>
#include<stdlib.h>
#define null 0
struct student
{
    
    
long num;
float score;
struct student *next;
};
void main(){
    
    
struct student a,b,c,*head,*p;
a.num=99101;a.score=89.5;//对结点的num和score成员赋值
b.num=99103;b.score=90;//将结点a的起始地址赋给头指针head
c.num=99107;c.score=85;//将结点b的起始地址赋给a结点的next成员
head=&a;
a.next=&b;
b.next=&c;
c.next=null;//c结点的next成员不存放其他结点地址
p=head;//使p指针指向a结点
do{
    
    
printf("%ld %5.1f\n",p->num,p->score);//输出p指向的结点的数据
p=p->next;//使p指向下一结点
}while(p!=null);//输出完c结点p的值为null
system("pause");
}

处理动态链表所需的函数

(1)malloc函数

void *malloc(unsigned int size);

作用是在内存的动态存储区中分配一个长度为size的连接空间。这些函数的值(返回值)是一个指向分配空间起始地址的指针(基本类型为void)。如果函数未能成功地执行(内存空间不足)则返回空指针NULL。

(2)calloc函数

void *calloc(unsigned n,unsigned size);

其作用是在内存的动态区存储中分配n个长度为size的连续空间。函数返回一个指向分配空间起始地址的指针,如果分配不成功,返回NULL。用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size。

(2)free函数

void free(void *p);

其作用是释放由p指向的内存区,使这部分内存区能被其它变量使用,p是最后一次调用callloc或malloc函数返回的值。free函数无返回值。

猜你喜欢

转载自blog.csdn.net/qq_31932681/article/details/95212744