zoukankan      html  css  js  c++  java
  • 第十五次课大纲--动态链表

    关于函数调用

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

    动态链表的建立

    在上一节课的例子中,所有结点都是在程序中定义好了,不是程序运行时定义(创建的),链表使用完依然占据存储空间,并没有释放空间。这种链表称为静态链表。相对应的还有动态链表:在程序运行过程中建立一个链表,一个一个地创建结点(为结点申请存储空间),并且将各个结点链接在一起,形成动态链表。
    如何动态申请空间那,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
    ",pt->num,pt->score);}
    		pt=pt->next;
    	}while(pt!=NULL);
    
    	return 0;
    }
    
  • 相关阅读:
    “校园知网”5月11日冲刺计划书
    “校园知网”5月10日冲刺计划书
    “校园知网”5月9日冲刺计划书
    学习进度
    “校园知网”5月8日冲刺计划书
    “校园知网”5月7日冲刺计划书
    “校园知网”5月6日冲刺计划书
    “校园知网”5月5日冲刺计划书
    “校园知网”5月4日冲刺计划书
    04-课后作业2-动手动脑及String类整理
  • 原文地址:https://www.cnblogs.com/c-programing-language/p/6704466.html
Copyright © 2011-2022 走看看