c语言之动态链表

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时,循环打印链表内容

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值