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

关于函数调用

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

动态链表的建立

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

你可能感兴趣的:(第十五次课大纲--动态链表)