关于函数调用
函数与函数之间传递数据,参数和返回值,参数:值传递、指针传递。
动态链表的建立
在上一节课的例子中,所有结点都是在程序中定义好了,不是程序运行时定义(创建的),链表使用完依然占据存储空间,并没有释放空间。这种链表称为静态链表。相对应的还有动态链表:在程序运行过程中建立一个链表,一个一个地创建结点(为结点申请存储空间),并且将各个结点链接在一起,形成动态链表。
如何动态申请空间那,malloc函数,释放空间:free函数。
建立一个动态链表,和静态链表一样,需要3个步骤:建立结点,初始化结点,和链接结点:
步骤1、 建立结点
结点使用结构实现,那么在建立结点之前,首先定义结构类型:
struct Student{
int num;
float score;
struct Student *next;
};
静态链表中每一个结点是一个结构变量,定义好变量后,编译器会给分配空间。但是动态链表的空间需要自己申请,那么申请空间的malloc函数的返回值是一个指针,所以我们需要定义一个结构指针,然后让该指针接收指向新申请的空间,空间大小是多大那,就是一个结构,所以动态链表的第一步建立结点的实现:
struct Student *head=NULL;
struct Student *pnew,*pend;
pnew=(struct Student *) malloc(sizeof(struct Student));
步骤2、初始化结点
静态链表每个结点是一个变量,可以直接在程序中赋值。而动态申请的空间则需要使用scanf来赋值:
printf("请输入学号和成绩:");
scanf("%d %f",&(pnew->num),&(pnew->score));
上述步骤1和步骤2即建立一个结点并对结点初始化的实现,那么一个链表不可能只有一个结点,如果需要多个结点的时候,该如何创建那?for或者while循环,假如想要建立10个结点,那么程序可以如下实现:
int n=10;
while(n != 0){
pnew=(struct Student *) malloc(sizeof(struct Student));
printf("请输入学号和成绩:");
scanf("%d %f",&(pnew->num),&(pnew->score));
n--;
}
但是上述方法结点个数依然是静态定义好的,不是我们用户在程序运行时随意选择的,那么想要实现结点个数也是动态的,有多种方法,可以scanf输入n,也可以将while循环条件换成学号,当输入的学号为0时停止创建结点:
pnew=(struct Student *) malloc(sizeof(struct Student));
printf("请输入学号和成绩:");
scanf("%d %f",&(pnew->num),&(pnew->score));
while(pnew->num != 0){
pnew=(struct Student *) malloc(sizeof(struct Student));
printf("请输入学号和成绩:");
scanf("%d %f",&(pnew->num),&(pnew->score));
}
上课经过同学提醒,上述程序还可以改成dowhile,这样就可以将代码简略下:
do{
pnew=(struct Student *) malloc(sizeof(struct Student));
printf("请输入学号和成绩:");
scanf("%d %f",&(pnew->num),&(pnew->score));
}while(pnew->num != 0);
3、链接结点
上述是创建多个结点,那么如何将结点链接起来?链接方式和静态链表类似,创建第一个结点后,第一个结点需要和头指针链接起来,然后再创建第二个结点时,需要将第二个结点和第一个结点链接再一起,也就是将第一个结点的next指向第二个结点。每次创建完一个结点可以做如下判断:
if(head == NULL) head = pnew; //pnew是第一个结点
else pend->next=pnew; //pnew不是第一个结点
pend=pnew; //pnew和pend不断指向新的结点
}
创建动态链表的完整程序如下,输出链表和静态链表一致:
#include
#include
struct Student{
int num;
float score;
struct Student *next;
};
struct Student *creat(void){
struct Student *head=NULL;
struct Student *pnew,*pend;
do{
pnew=(struct Student *) malloc(sizeof(struct Student));
printf("请输入学号和成绩:");
scanf("%d %f",&(pnew->num),&(pnew->score));
if(head == NULL) head = pnew;
else pend->next=pnew;
pend=pnew;
}while(pnew->num != 0);
pend->next = NULL;
return head;
}
int main(){
struct Student *pt;
pt=creat();
//for(;pt!=NULL;pt=pt->next){
do{
if(pt->num !=0){
printf("%ld %5.1f\n",pt->num,pt->score);}
pt=pt->next;
}while(pt!=NULL);
return 0;
}