您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

链表操作总结:基于C++

前言:

大三就开始了实习,但是刚刚发现居然连链表的操作都不会写,早就忘得一干二净了,脑海里好像也只有点链表的印象,果然基础不牢地动山摇,总结一遍链表的操作也帮助自己今后复习。

强烈建议参考文献(从初学者的角度来说):《大话数据结构》

1. 开始:

首先确认节点node的数据结构

typedef struct node{
    int value;
    struct node *next;
}node;

然后我们要做的事就是生成第一个节点(我取名为head):

   node *head;
   head = new node;
   head->value = 0;//给他的数据域赋值为0
   head->next = NULL;//指定他的下一个节点为空

2.在这之后新建一个节点

在这里插入图片描述

   node *pnew;
   pnew = new node;
   pnew->value = 1;
   pnew->next = NULL;
   head->next = pnew;//这里之前是重复的操作,我们就只是将刚才的节点的next指向了这个节点

觉得好简单是不是,哈哈哈哈哈,可能有人说随便一个计算机在读的本科生都能写出来是不是,我也不敢信长时间不看链表操作的时候我居然会一头蒙,唉,果然看别人的代码和自己能写出来的代码完全就是两回事,真的是基础不牢地动山摇

3.从中插入一个节点

在这里插入图片描述
(我们假设不知道pnew,只知道head)我们从中插入一个新节点pnew2,首先插入将新节点pnew的next指向head的下一个节点pnew,然后将head的next指向插入节点pnew2:

1.pnew2->next = head->next;
2.head->next = pnew2;  

这里能不能转换呢?答案肯定是:不行的🙅‍♂️

因为在CPP里,=是赋值操作,但我更喜欢将她理解为copy,拷贝操作,也就是传值,如果我们反过来

-----错误示范-----
1.head->next = pnew2; 
2.pnew2->next = head->next; //相当于pnew2->next = pnew2

这里已经将head->next赋值了,也就是已经拷贝过去了,接下来就的语句就相当于变成了pnew2->next = pnew2

请记住

  1. = 相当于拷贝赋值 2.指针即变量

4.通过循环建立链表

我们在新节点之后循环建立链表
在这里插入图片描述
我们先将head节点的位置移到pnew(=即是拷贝赋值):

while (head != NULL)
   {
      head = head->next;
      if (head->next == NULL)
         break;
   }

然后我们进行循环创建节点

   node *index,*pnews;
   index = head/*->next->next*/;//这里为什么注掉,一会说

   for (int i = 3; i < 10; i++)
   {
      pnews = new node;
      pnews->value = i;
      pnews->next = NULL;//建立新节点

      index->next = pnews;//指向新节点
      index = pnews;//移动哨兵
      
   }

在这里插入图片描述

我们需要建立一个哨兵(index),为什么呢,你要想象你在建立新链表的过程就好比在挖隧道,你就好比这个哨兵,实时监控隧道的情况,循环建立链表就相当于每个循环内凿一个洞(节点),并随时准备好在当前节点凿下一个节点。

我们看下运行结果:
在这里插入图片描述
因为我们从节点pnew开始的(数据域为1),所以从1开始,然后我们执行循环建立链表。

假如我们取消掉移head的操作(取消前面的while移动操作),然后我们直接index = head->next->next(当然了我这里只是为了演示,这样操作可能不太专业)

   node *index,*pnews;
   index = head->next->next;

   for (int i = 3; i < 10; i++)
   {
      pnews = new node;
      pnews->value = i;
      pnews->next = NULL;

      index->next = pnews;
      index = pnews;
      
   }

然后输出打印情况的对比在这里插入图片描述

因为我们取消了head的移动,而是直接从head->next->next开始(也就是pnew,数据域为1)建立循环链表。

5.删除某个节点

假如删除数据域为5的节点。
在这里插入图片描述

if (head->next->value == 5)
      {
         head->next = head->next->next;  
      }

仅需将想删除的节点跳过即可:

while (head != NULL)
   {
      printf("%d->",head->value);
      head = head->next;
      if (head->next == NULL)
      {
      printf("%d",head->value);
      break;}//这里是打印节点操作

      if (head->next->value == 5)
      {
         head->next = head->next->next;  
      }//删除操作
      
   }

在这里插入图片描述
附上该程序的完整代码:

#include <stdio.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <cmath>
using namespace std;

typedef struct node{
    int value;
    struct node *next;
}node;


int main()
{
   node *head;
   head = new node;
   head->value = 0;
   head->next = NULL;

   node *pnew;
   pnew = new node;
   pnew->value = 1;
   pnew->next = NULL;
   head->next = pnew;

   node *pnew2;
   pnew2 = new node;
   pnew2->value = 2;
   pnew2->next = head->next;
   head->next = pnew2;  
    
   while (head != NULL)
   {
      
      head = head->next;
      if (head->next == NULL)
      {
      break;
      }
   }

   node *index,*pnews;
   index = head/*->next->next*/;

   for (int i = 3; i < 10; i++)
   {
      pnews = new node;
      pnews->value = i;
      pnews->next = NULL;

      index->next = pnews;
      index = pnews;
      
   }
    
   while (head != NULL)
   {
      printf("%d->",head->value);
      head = head->next;
      if (head->next == NULL)
      {
      printf("%d",head->value);
      break;}

      if (head->next->value == 5)
      {
         head->next = head->next->next;  
      }
      

   }
   

  
   return 0; 
}

总结

1.= 拷贝赋值
2.指针即变量
3.基础不牢,地动山摇


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进