zoukankan      html  css  js  c++  java
  • 数据结构学习笔记(4)——链表的插入和删除

    说明(2018-3-19 15:32:59):

    1. 按照自己的理解写的,循环遍历的部分不太一样,大于小于什么的细节也不一样,可能视频里的方法比较健壮吧,只是这个不是重点地方。

    2. 链表的插入和删除思想基本是一样的,插入就是把一侧指针断开,加入新节点,再把指针连起来。删除就是把两侧指针断开,前一个指针跟后一个指针连接。

    3. 补充一点,删除元素的时候,要把被删除的元素先保存起来,pNODE q = p->pNext,然后free(q),q=NULL,不然这块内存就找不到了,也不会释放。注意free后面要紧跟=NULL。

    指针free之后,free函数只是把指针指向的内存空间释放了,即内存中存储的值,但是并没有将指针的值赋为NULL,指针仍然指向这块内存。而程序判断一个指针是否合法,通常都是使用if语句测试该指针是否为NULL来判断,导致指针成为所谓的“野指针”,诱导误操作。
      1 #include<stdio.h>
      2 #include<malloc.h>
      3 #include<stdlib.h>
      4 #pragma warning(disable:4996)
      5 #include<stdbool.h>
      6 
      7 typedef struct Node
      8 {
      9     int data;
     10     struct Node * pNext;
     11 
     12 }NODE, *pNODE;
     13 pNODE CreatList();
     14 void ShowList(pNODE pHead);
     15 int LengthList(pNODE pHead);
     16 bool InsertList(pNODE pHead, int pos, int val);
     17 bool DeleteList(pNODE pHead, int pos, int*val);
     18 
     19 void main()
     20 {
     21     pNODE pHead = CreatList();
     22     ShowList(pHead);
     23     //int len = LengthList(pHead);
     24     //printf("链表长度为%d
    ", len);
     25     //InsertList(pHead, 2, 100);
     26     int val;
     27     if (DeleteList(pHead, 4, &val))
     28     {
     29         printf("删除成功!");
     30     }
     31     else
     32     {
     33         printf("删除失败!");
     34     }
     35 
     36     printf("删除的值是:%d
    ", val);
     37     printf("
    ");
     38     ShowList(pHead);
     39     system("pause");
     40 }
     41 
     42 pNODE CreatList()
     43 {
     44     pNODE pHead = (pNODE)malloc(sizeof(NODE));
     45     pNODE pTail = pHead;
     46     if (pHead == NULL)
     47     {
     48         printf("内存分配失败!");
     49         exit(-1);
     50     }
     51     printf("请输入链表的长度:");
     52     int len;
     53     scanf("%d", &len);
     54     for (int i = 0; i < len; i++)
     55     {
     56         pNODE pNew = (pNODE)malloc(sizeof(NODE));
     57         if (pNew == NULL)
     58         {
     59             printf("内存分配失败!");
     60             exit(-1);
     61         }
     62         int val;
     63         printf("请输入第%d个元素的数值:", i + 1);
     64         scanf("%d", &val);
     65         pNew->data = val;
     66         pTail->pNext = pNew;
     67         pTail = pNew;
     68         pNew->pNext = NULL;
     69     }
     70     return pHead;
     71 }
     72 
     73 void ShowList(pNODE pHead)
     74 {
     75     pNODE p = pHead->pNext;
     76     while (p != NULL)
     77     {
     78         printf("%d ", p->data);
     79         p = p->pNext;
     80     }
     81     return;
     82 }
     83 
     84 int LengthList(pNODE pHead)
     85 {
     86     int len = 0;
     87     pNODE p = pHead->pNext;
     88     while (p != NULL)
     89     {
     90         p = p->pNext;
     91         len++;
     92     }
     93     return len;
     94 
     95 }
     96 
     97 bool InsertList(pNODE pHead, int pos, int val)
     98 {
     99     pNODE pNew = (pNODE)malloc(sizeof(NODE));
    100     if (pNew == NULL)
    101     {
    102         exit(-1);
    103     }
    104     int len = LengthList(pHead);
    105     if (pos<1 || pos>len)
    106     {
    107         return false;
    108     }
    109     pNew->data = val;
    110     pNODE p = pHead;
    111     int n = 0;
    112     while (p != NULL)
    113     {
    114         n++;
    115         if (n == pos)
    116         {
    117             pNew->pNext = p->pNext;
    118             p->pNext = pNew;
    119             break;
    120         }
    121         p = p->pNext;
    122     }
    123     return true;
    124 }
    125 
    126 bool DeleteList(pNODE pHead, int pos, int*pVal)
    127 {
    128     int n = 0;
    129     pNODE p = pHead;
    130     if (p == NULL || pos < 1)
    131     {
    132         return false;
    133     }
    134     while (p != NULL&&n < pos - 1)
    135     {
    136         p = p->pNext;
    137         n++;
    138     }
    139     *pVal = p->pNext->data;
    140     p->pNext = p->pNext->pNext;
    141     return true;
    142 }
  • 相关阅读:
    C#自定义控件的开发:Pin和Connector
    C# 调用第三方DLL完整实例
    利用微软Speech SDK 5.1开发语音识别系统主要步骤
    如何在Android中使用OpenCV
    VS 2012单元测试和测试资源管理器
    .NET Reflector插件FileDisassembler还原源码
    根据powerdesigner的OO模型生成C#代码
    SQLServer2008设置开启INTERNET远程连接
    Kudu-压缩
    kudu的读取数据流程
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/8602535.html
Copyright © 2011-2022 走看看