c语言之动态链表

时间:2024-05-05 11:59:21

c语言中动态链表是在需要生成新的链表时通过内存生成函数不断生成新的空间,用来安置新的链表数据。静态链表则不需要内存分配函数,而是结构体有一个指针,直接指向下一个链表。

示例代码如下

#include<stdio.h>
#include <string.h>
#include <stdlib.h>

struct test
{
	char name[30];
	int age; 
	int student_number;
	struct test *next;			
};

void main()
{
	struct test *head, *p1,*p2;
	int n = 0;
	
	p1 = p2 = malloc(sizeof(struct test));			
	printf("请输入姓名 年龄 学号:");
	scanf("%s %d %d",p1->name,&p1->age,&p1->student_number);
	head = NULL;
	while(p1->student_number > 0)
	{
		n = n+1;								
		if(n == 1)	head = p1;						
		else p2->next = p1;
		p2 = p1;
		p1 = malloc(sizeof(struct test));			
		printf("请输入姓名 年龄 学号:");
		scanf("%s %d %d",p1->name,&p1->age,&p1->student_number);
	}
	p2->next = NULL;
													
	p1 = head;
	while(p1 != NULL)				
	{
		printf("姓名:%s\t年龄:%d\t学号:%d\n",p1->name,p1->age,p1->student_number);
		p1 = p1->next;
	}
}

代码分析

struct test
{
    char name[30];
    int age; 
    int student_number;
    struct test *next;            
};

这段代码是创建一个结构体,结构体里面分别有name,age,student_number等数据

struct test *head, *p1,*p2;
    int n = 0;

这段代码表示分别创建结构体指针head,p1,p2,定义一个整型数据变量 n,n的值等于0

p1 = p2 = malloc(sizeof(struct test));

这段代码表示指针p1,p2用malloc创建一个空间

 printf("请输入姓名 年龄 学号:");
 scanf("%s %d %d",p1->name,&p1->age,&p1->student_number);
head=NULL;

这段代码是输入第一个链表内容,同时指针head指向内容NULL,也就是空内容

while(p1->student_number > 0)
    {
        n = n+1;                                
        if(n == 1)    head = p1;                        
        else p2->next = p1;
        p2 = p1;
        p1 = malloc(sizeof(struct test));            
        printf("请输入姓名 年龄 学号:");
        scanf("%s %d %d",p1->name,&p1->age,&p1->student_number);
    }
    p2->next = NULL;

这段代码是一个循环体,假如说student_number不等于0,首先检查n的值,n=n+1,首次执行,n=1,执行if语句里的内容是true语句,指针head指向指针p1,这时候student_number不为0,n=1+1=2,执行if语句里else段的语句

首先是p2指针指向结构体里面指针next,next指针又指向p1,也就是说p1,p2这两个指针指向下一个链表,然后p2又指向p1,p1又通过malloc函数分配结构体空间,再次执行输入结构体内容

接着再次进入循环,再次执行else里面的语句,p2指向指针next,next指向p1,再次指向新的链表,再次通过malloc函数分配空间,再次输入链表内容。

假定输入的student_number=0,结束循环,p2指向指针next,指向内容null,结束整个链表
p1 = head;
    while(p1 != NULL)               
    {
        printf("姓名:%s\t年龄:%d\t学号:%d\n",p1->name,p1->age,p1->student_number);
        p1 = p1->next;
    }

这段代码中指针p1指向head,head已经指向第一个链表

当指针p1不指向null时,循环打印链表内容