结构体指针-模拟链表

这篇博客通过C语言创建并操作链表,首先定义了一个结构体`node_t`表示链表节点,然后创建了三个节点并连接成链表。接着实现了链表的正向和逆向遍历输出。此外,还展示了动态分配内存创建10个节点的链表,并进行遍历。最后提到了内存管理,特别提及了内存泄漏的情况。
摘要由CSDN通过智能技术生成

#include <stdio.h>

#include <stdlib.h>



//创建结构体:重命名为node_t,指针重命名为p2node_t

typedef struct linknode{

   int data;

//next指针的作用是用来指向下一个“struct link node*”类型的变量。

   struct linknode* next;

}node_t,*p2node_t;


int main(int argc,constchar * argv[]) {

    

    //第一节点

   node_t node_01;

    node_01.data =10;

    node_01.next =NULL;

    

    //第二节点

   node_t node_02;

    node_02.data =20;

    node_02.next =NULL;

    

    //第三节点

   node_t node_03;

    node_03.data =30;

    node_03.next =NULL;

    

    //定义头指针:

//p2head的作用是用来追踪(记录)当前节点地址(位置)

   p2node_t p2head =NULL;

    p2head = &node_01;

    node_01.next = &node_02;

    node_02.next = &node_03;

    

    //尾节点的nextNULL

   for(;p2head!=NULL;p2head = p2head->next){

       printf("%d\n",p2head->data);

    }

    

    //链表逆序输出

    node_01.next = node_01.next->next;

    node_02.next = p2head;

    p2head = &node_02;

 

    p2head =NULL;

    {

       //与上面创建节点类似,不过下面的方法是通过for循环创建10个同名节点

       //但是除了名字相同外,却各不相同,他们有自己的datanext和地址

       for(int i =1;i<10;i++){

            

           //创建新节点pp

           p2node_t pp = (p2node_t)malloc(sizeof(100));

           //检查是否分配成功

           if (pp ==NULL) {

               perror("no much RAM!");

            }

           //新节点pp数据存储

            pp->data = i;


           //pp节点的next始终是指向上一个pp节点的地址的,如果没有则为零

            pp->next = p2head;


           /*

             p2head指向当前pp节点的地址

             第一次循环开始时,p2head所指向的是data=1pp节点的地址

             最后一次循环结束时,p2head所指向的时data=10pp节点的地址

             */

            p2head = pp;

        

        }

        

       for (int i =1; i<10; i++) {

           printf("%d\n",p2head->data);

           /*

            第一次循环开始时p2head所指向的是data = 10的存储节点,即

            p2head = pp;p2head->next = pp->next,因为pp->next所指向

            的是上一个pp节点地址,所以······

            */

            p2head = p2head->next;

        }

for (int i =1; i<10; i++) {  

//释放内存:

free????

   }

    }

//内存泄露特例:

//char* a[]  = {NULL};

   //a[0]=(char*)malloc(100);

   //a[1]=(char*)malloc(100);

   //a[0] ="you are y";


   //a[1]d的内存就变成垃圾了,但是依然保留,

   //a[1] = a[0];


    printf("Hello, World!\n");


   return0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值