美文网首页
链表的创建与插入

链表的创建与插入

作者: mark_x | 来源:发表于2019-08-06 11:58 被阅读0次

使用链表保存结构体,结构体只有一个成员num。
重点理解:

  • 在分配动态内存空间,返回值是指针。导致不太好理解了,万恶之源!!
  • 为什么head_pointer是指向<结构体指针>的指针:结构体存储在堆中,访问都要靠指针,内层的<结构体指针>其实与可以理解成与局部变量是一致的,只不过一个是变量本身,一个是指针。
  • 因为上面这两个问题,才导致add函数中,传入参数是指针的指针。
  • 其实明确一个原则就可以:使用指针进行参数传递时,想访问谁就传递谁的指针。
#include <stdio.h>
#include <stdlib.h>

// define struct Node
struct Node
{
    int num;
    struct Node *next;
};

void get_info(struct Node *node)
{
    printf("Please enter the num: ");
    scanf("%d", &node -> num);
}

void addNode(struct Node **head_pointer)//(*head_pointer)是定义一个结构体指针,*(*(head_pointer))就是定义一个指向结构体指针的指针;*表示定义指针
{
    struct Node *temp;
    // instruct a new node
    struct Node *node = (struct Node *)malloc(sizeof(struct Node)); // 创建一个node
    
    // write information in the new object
    get_info(node);
    
    // make the head_pointer point to the new object
    
    if (*head_pointer != NULL)
    {
        temp = *head_pointer;
        *head_pointer = node; //*表示解引用,head_pointer是一个指向结构体指针的指针,一层解引用就是结构体指针,使结构体指针指向node,也就是新插入的对象node
        node -> next = temp;
    }
    else
    {
        *head_pointer = node;// 只要是修改值,就是*(指针名)
        node -> next = NULL;
    }
}



void printNode(struct Node *head_pointer)
{
    struct Node *node;
    int count = 1; 
    
    node = head_pointer;
    
    while (node != NULL)
    {
        printf("---Node Sequence Number: %d---\n", count);
        printf("\tNum: %d\n", node -> num);
        node = node -> next;
        count++;
    }
}

void releaseNode(struct Node *node)
{
   struct Node *temp;
    
    while(node != NULL)
    {
        temp = node -> next; //node是指针,第一次node存有第一个元素的地址,因此node->就是第二个元素的地址
        free(node);
        node = temp;
        
    
    }
}


int main()
{
    char ch;
    struct Node *head_pointer;
    head_pointer = NULL;  // 指针初始化,指向指向地址NULL
    
    while(1)
    {
        printf("Do you need enter num(Y/N)?");
        do
        {
            ch =getchar();
        } while(ch != 'Y' && ch != 'N');
        
        if (ch == 'Y')
        {
            addNode(&head_pointer); // 总之,想访问谁的值就传入谁的地址
        }
        else
        {
            break;
        }
    }
    

    printf("Do you need to print the information? (Y/N):");
        do
        {
            ch =getchar();
        } while(ch != 'Y' && ch != 'N');
        
        if (ch == 'Y')
        {
            printNode(head_pointer);  //为什么不取head_pointer地址了?因为想访问的不是head_pointer本身,而是他指向的对象。想访问第一个对象,因此把第一个对象的地址,也就是head_pointer传过去。
        }
        
releaseNode(head_pointer);
    
    return 0;
}

    

相关文章

  • 数据结构与算法(三)

    1 双向链表 1.1 双向链表的创建 基础设置 创建 打印数据 1.2 双向链表的插入 正常情况 1.创建需要插入...

  • 链表的创建与插入

    使用链表保存结构体,结构体只有一个成员num。重点理解: 在分配动态内存空间,返回值是指针。导致不太好理解了,万恶...

  • 19.数据结构-线性表-2.单链表增加和删除

    0>>>初始化和创建 1>>>单链表的插入和删除。 1.单链表的插入 2.单链表的删除 2>>>单链表的整表创建和...

  • 链表

    单向链表 包含,创建,析构,指定位置插入,指定位置删除,反向链表,打印 双向链表 包含,创建,析构,指定位置后插入...

  • 单向循环链表

    结构体 链表创建 插入 删除 打印

  • 147. Insertion Sort List

    思路 插入排序的思想,将未排序的与已知排好序的作比较,进行插入 创建一个链表来作为已知链表(rptr), 比较的是...

  • 1链表相关操作

    1.创建带头节点的链表,并且遍历输出。 题目 2.插入新链表,保持顺序,并遍历输出链表。 3.插入新的链表,并遍历...

  • JavaScript数据结构2——单链表

    以下的代码包括了以下几部分 单链表初始化 单链表的插入 单链表的删除 单链表的创建(头插法) 单链表的创建(尾插法...

  • 数据结构与算法03-单向循环链表实现总结

    单向循环链表结构体设计 打印 尾插法创建链表 插入 删除 查索引

  • 双向链表&双向循环链表

    一、双向链表 带有前驱结点、后区节点 双向链表的创建 双向链表插入-逻辑 双向链表删除 删除双向链表指定的元素 二...

网友评论

      本文标题:链表的创建与插入

      本文链接:https://www.haomeiwen.com/subject/zrsidctx.html