第十五次课大纲--动态链表

关于函数调用

函数与函数之间传递数据,参数和返回值,参数:值传递、指针传递。

动态链表的建立

在上一节课的例子中,所有结点都是在程序中定义好了,不是程序运行时定义(创建的),链表使用完依然占据存储空间,并没有释放空间。这种链表称为静态链表。相对应的还有动态链表:在程序运行过程中建立一个链表,一个一个地创建结点(为结点申请存储空间),并且将各个结点链接在一起,形成动态链表。
如何动态申请空间那,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 <stdio.h>
#include <stdlib.h>

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;
}

posted on 2017-04-14 11:11  niuxiaoxia  阅读(348)  评论(0编辑  收藏  举报

导航