zoukankan      html  css  js  c++  java
  • C语言链表

    链表

    链表:一系列结构连在一起,每一个结构体变量里面都有一个指针pNext,pNext指向下一个结构体变量,尾节点的pNext指向NULL。

    静态链表:

     struct students stu1 = { 1, "a", NULL };
    ​ struct students stu2 = { 2, "b", NULL };
    ​ struct students stu3 = { 3, "c", NULL };
    ​ stu3.pNext = &stu2;
    ​ stu2.pNext = &stu1;
    

    动态内存分配:

    Malloc();

    ​ void *malloc(unsigned int size)

    ​ 这个函数在内存中动态开辟一块内存,unsigned int size决定内存的大小,void *空指针可以强制转换为任何类型的指针。

    这个函数返回一个指针,这个指针就是开辟的内存地址。

    pHead = (struct students*)malloc(sizeof(struct students));
    

    free();

    ​ void free(void *ptr)

    ​ free:释放内存。

    ​ free(pHead);

    怎样来创建一个链表

    创建一块内存:

      struct students *pHead = NULL; //头指针
    ​ struct students *pEnd = NULL; //尾指针     
    ​ pHead = (struct students *)malloc(sizeof(struct students)); //开辟头结点
    ​ printf("请输入一个学生的学号和姓名:
    ");
    ​ scanf("%d%s", &pHead->number, pHead->name);
    ​ pHead->pNext = NULL;
      printf("%d
    ", pHead->number);
    
    1. 增:

    1、头部增加:头结点会变 需要返回一个pHead。

    2、新节点的pNext指向pHead。

    3、pHead指向pNew。

    注意:2和3不能逆序。

    //在头部插入一个节点

    struct students *InsertAtHead(struct students *pHead)
    {
    ​     //新建一个节点
    ​     printf("
    
    在头部插入一个节点
    ");
    ​     struct students *pNew;
    ​     pNew = (struct students*)malloc(sizeof(struct students));
    ​     printf("请输入新学生的信息!
    ");
    ​     scanf("%d%s", &pNew->number, pNew->name); 
    ​     pNew->pNext = pHead; //让新节点的pNext-》原来的头结点。
    ​     pHead = pNew;     //把pHead指向新节点  
    ​     count++;      //节点数+1
    ​     return pHead;
    }
    

    2.在尾部插入一个节点

    1、创建一个节点pNew

    2、顶一个中间的指针pTemp 通过循环(条件为pTemp->pNext!=null).得到尾节点。

    3、pTemp->pNext=pNew;

    pNew->pNext=NULL;

    在尾部插入一个节点

    void InsertAtEnd(struct students *pHead)
    {
    ​     //新建一个节点
    ​     printf("
    
    在尾部插入一个节点
    ");
    ​     struct students *pNew;
    ​     pNew = (struct students*)malloc(sizeof(struct students));
    ​     printf("请输入新学生的信息!
    ");
    ​     scanf("%d%s", &pNew->number, pNew->name);
    ​     struct students *pTemp;
    ​     pTemp = pHead;
    ​     //for (int i = 1; i < count; i++) //节点数的值
    ​     //{
    ​     //    pTemp = pTemp->pNext;
    ​     //}
    ​     //for (; pTemp->pNext != NULL; pTemp = pTemp->pNext);
    ​     while (pTemp->pNext != NULL)
    ​     {
    ​         pTemp = pTemp->pNext;
    ​     }
    ​     pNew->pNext = NULL;
    ​     pTemp->pNext = pNew;
    ​     count++; //节点数
    }
    

    3. 在中间插入

    //在中间(第几个节点之后)插入节点

    void InsertAtMid(struct students *pHead, int index)
    {
    ​     //新建一个节点
    ​     printf("
    
    在第%d个节点后插入一个节点
    ",index);
    ​     struct students *pNew;
    ​     pNew = (struct students*)malloc(sizeof(struct students));
    ​     printf("请输入新学生的信息!
    ");
    ​     scanf("%d%s", &pNew->number, pNew->name);
    ​     struct students *pTemp;
    ​     struct students *pPre;
    ​     pTemp = pHead;
    ​     pPre = pHead; 
    ​     for (int i = 1; i < index+1; i++) //假设index=2 需要循环2次
    ​     {
    ​         pPre = pTemp;
    ​         pTemp = pTemp->pNext;
    ​     }
    ​     pPre->pNext = pNew;
    ​     pNew->pNext = pTemp;
    ​     count++;
    }
    

  • 相关阅读:
    HDU 6197 array array array nlogn求最长子序列 思维
    HDU 6198 number number number 矩阵快速幂 找规律
    HDU 6195 cable cable cable 思维
    urumuqi 网络赛 H skiing DP
    urumqi 网络赛 E Half-consecutive Numbers 数论
    urumqi 网络赛 C Coconut 水题
    UVA 122 Trees on the level 二叉树 广搜
    POJ3468【线段树lazy操作】
    线段树萌新讲解+一道水题【一点一滴】
    hdoj5792 【树状数组】【未完待续】
  • 原文地址:https://www.cnblogs.com/qzdd/p/12340473.html
Copyright © 2011-2022 走看看