复习:数组、指针和数组指针的关系
数组是一串连续的存储空间,数组名对应的是存储空间的首地址,比较安全、
指针有多样性,不安全,但是灵活,容易出现野指针
数组指针的本质是数组,数组里的元素是指针
---------------------------------------------------------------------------------------------------------------------------------
链式物理结构的动态分配内存、释放
链式物理结构中每个有效结点都应该是动态分配的
链式物理结构中能容纳的数字数量可以灵活变化
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int num;
struct node *p_next;
} node;
int main()
{
int num = 0;
node head = {0},tail = {0},*p_tmp = NULL,*p_node = NULL;
head.p_next = &tail;
while (1)
{
printf("请输入一个数字:");
scanf("%d",&num);
if (num < 0)
{
break;
}
p_tmp = malloc(sizeof(node));
if (!p_tmp)
{
continue;
}
p_tmp->num = num;
p_tmp->p_next = NULL;
for (p_node = &head;p_node != &tail;p_node = p_node->p_next)
{
node *p_first = p_node;
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
if (p_mid == &tail) //插在最后的位置
{
p_first->p_next = p_tmp;
p_tmp->p_next = p_mid;
break;
}
}
}
for (p_node = &head;p_node != &tail;p_node = p_node->p_next)
{
node *p_first = p_node;
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
if (p_mid != &tail)
{
printf("%d",p_mid->num);
}
}
printf("\n");
释放内存 while (head.p_next != &tail) // 只要存在有效节点,循环就继续
{
node *p_first = &head;
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
p_first->p_next = p_last; // 先摘出来再释放
free(p_mid);
p_mid = NULL;
}
return 0;
删除一个点时要释放内存:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int num;
struct node *p_next;
} node;
int main()
{
int num = 0;
node head = {0},tail = {0},*p_tmp = NULL,*p_node = NULL;
head.p_next = &tail;
while (1)
{
printf("请输入一个数字:");
scanf("%d",&num);
if (num < 0)
{
break;
}
p_tmp=(node *)malloc(sizeof(node));
if (!p_tmp)
{
continue;
}
p_tmp->nu