欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ 單鏈表的基本操作(詳解)

 更新時(shí)間:2016年12月18日 12:47:45   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇C++ 單鏈表的基本操作(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

鏈表一直是面試的高頻題,今天先總結(jié)一下單鏈表的使用,下節(jié)再總結(jié)雙向鏈表的。本文主要有單鏈表的創(chuàng)建、插入、刪除節(jié)點(diǎn)等。

1、概念

單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素

鏈表中的數(shù)據(jù)是以結(jié)點(diǎn)來(lái)表示的,每個(gè)結(jié)點(diǎn)的構(gòu)成:元素 + 指針,元素就是存儲(chǔ)數(shù)據(jù)的存儲(chǔ)單元,指針就是連接每個(gè)結(jié)點(diǎn)的地址數(shù)據(jù)。如下圖:

2、鏈表的基本操作

SingleList.cpp:

#include "stdafx.h"
#include "SingleList.h"
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <conio.h>
#include <stdio.h>

/*c++實(shí)現(xiàn)簡(jiǎn)單的單鏈表操作*/
using namespace std;

SingleList::SingleList()
{
  int num;
  char name[128];

  // 創(chuàng)建鏈表
  node *stuList = CreatNode();
  PrintList(stuList);

  // 插入節(jié)點(diǎn)
  printf("\n請(qǐng)輸入要插入的學(xué)生學(xué)號(hào)和姓名,輸入0 0表示結(jié)束.");
  scanf_s("%d%s", &num, name, 100);
  stuList = InsertNode(stuList, num, name);
  PrintList(stuList);

  // 刪除節(jié)點(diǎn)
  printf("\n請(qǐng)輸入要?jiǎng)h除的學(xué)生學(xué)號(hào):");
  scanf_s("%d", &num, 100);
  stuList = DeleteNode(stuList, num);
  PrintList(stuList);

  // 逆序
  printf("\n逆序后的鏈表為:\n");
  stuList = ReverseList(stuList);
  PrintList(stuList);

  system("PAUSE");
}


SingleList::~SingleList()
{
}

//建立單鏈表 
node *SingleList::CreatNode()
{
  node *head, *p, *s;

  int num = 0;
  char name[128];
  int cycle = 1;

  head = (node *)malloc(sizeof(node));  // 為頭結(jié)點(diǎn)分配內(nèi)存空間
  head->next = nullptr;
  p = head;    // p指向頭節(jié)點(diǎn)

  while (cycle)
  {
    printf("\n請(qǐng)輸入學(xué)生的學(xué)號(hào)和姓名:");
    scanf_s("%d%s", &num, name, 100);

    if (num != 0)
    {
      s = (node *)malloc(sizeof(node));
      s->num = num;
      memcpy(s->name, name, 128);
      printf("%d%s", s->num, s->name);
      p->next = s;    // 指向新插入的節(jié)點(diǎn)
      p = s;    // p指向當(dāng)前節(jié)點(diǎn)
    }
    else
    {
      cycle = 0;
    }
  }

  head = head->next;
  p->next = NULL;
  printf("頭節(jié)點(diǎn)學(xué)生信息為: %d%s\n", head->num, head->name);

  return head;
}

//單鏈表插入
node *SingleList::InsertNode(node *head, int num, char* name)
{
  node *s, *p1, *p2 = NULL;

  p1 = head;
  s = (node *)malloc(sizeof(node));
  s->num = num;
  strcpy_s(s->name, name);

  while ((s->num > p1->num) && p1->next != NULL)
  {
    p2 = p1;
    p1 = p1->next;
  }

  if (s->num <= p1->num)
  {
    if (head == p1)
    {
      // 插入首節(jié)點(diǎn)
      s->next = p1;
      head = s;
    }
    else
    {
      // 插入中間節(jié)點(diǎn)
      p2->next = s;
      s->next = p1;
    }
  }
  else
  {
    // 插入尾節(jié)點(diǎn)
    p1->next = s;
    s->next = NULL;
  }

  return head;
}

// 計(jì)算單鏈表長(zhǎng)度
int SingleList::GetLength(node *head)
{
  int length = 0;
  node *p;
  p = head;

  while (p != NULL)
  {
    p = p->next;
    length++;
  }
  return length;
}

//單鏈表刪除某個(gè)元素 
node *SingleList::DeleteNode(node *head, int num)
{
  node *p1, *p2 = nullptr;
  p1 = head;

  while (num != p1->num && p1->next != NULL)
  {
    p2 = p1;
    p1 = p1->next;
  }

  if (num == p1->num)
  {
    if (p1 == head)
    {
      head = p1->next;
    }
    else
    {
      p2->next = p1->next;
    }
    free(p1);
  }
  else
  {
    printf("找不到學(xué)號(hào)為%d 的學(xué)生!\n", num);
  }
  return head;

}

//單鏈表逆序
node *SingleList::ReverseList(node *head)
{
  // A->B->C->D
  node *old_head;    // 原來(lái)鏈表的頭
  node *new_head;    // 新鏈表的頭
  node *cur_head;    // 獲得原來(lái)鏈表的頭

  if (head == NULL || head->next == NULL)
    return head;

  new_head = head;        // A
  cur_head = head->next;    // B
  while (cur_head)
  {
    old_head = cur_head->next;    // 將原來(lái)鏈表的頭取出,并將第二個(gè)節(jié)點(diǎn)作為頭節(jié)點(diǎn)
    cur_head->next = new_head;  // 將取出的頭設(shè)為新鏈表的頭
    new_head = cur_head;        // 新鏈表的頭就是目前新鏈表的頭
    cur_head = old_head;          // 接著處理
  }
  head->next = NULL;
  head = new_head;
  return head;
}

//打印單鏈表
void SingleList::PrintList(node *head)
{
  node *p;
  int n;
  n = GetLength(head);
  printf("\n打印出 %d 個(gè)學(xué)生的信息:\n", n);

  p = head;
  while (p != NULL)
  {
    printf("學(xué)號(hào): %d ,姓名: %s\n", p->num, p->name);
    p = p->next;
  }
}

SingleList.h:

#pragma once
typedef struct student
{
  int num;        // 學(xué)號(hào)
  char name[128]; // 姓名
  struct student *next;
}node;

class SingleList
{
public:
  SingleList();
  ~SingleList();

  //建立單鏈表 
  node *CreatNode();
  //單鏈表插入
  node *InsertNode(node *head, int num, char* name);
  // 計(jì)算單鏈表長(zhǎng)度
  int GetLength(node *head);
  //單鏈表刪除某個(gè)元素 
  node *DeleteNode(node *head, int num);
  //單鏈表逆序
  node *ReverseList(node *head);
  //打印單鏈表
  void PrintList(node *head);

};

關(guān)于逆序邏輯,研究了一下:

1、主要思路:

假設(shè)有單鏈表A->B->C->D,首先取出首節(jié)點(diǎn)A作為新逆序出來(lái)的鏈表

這樣,原鏈表就為:B->C->D,逆序后的新鏈表為:A

2. 按照上述方法,依次取出B、C、D放入新鏈表

2、圖形表示:

  原始的單鏈表:

  
<!--[endif]-->

初始狀態(tài)時(shí),單鏈表如上圖所示,head指向頭節(jié)點(diǎn)A。

1. 取出原始鏈表的第一個(gè)節(jié)點(diǎn)A,然后將該節(jié)點(diǎn)作為新鏈表的頭節(jié)點(diǎn)

原始鏈表:

  
<!--[endif]-->

  新鏈表:

<!--[if !vml]-->  <!--[endif]-->

<!--[if !supportLists]--> 2.然后同上處理:

 原始鏈表:

<!--[if !vml]--> <!--[endif]-->

  新鏈表:

<!--[if !vml]--> <!--[endif]-->

以上這篇C++ 單鏈表的基本操作(詳解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++中繼承的概念和定義

    C++中繼承的概念和定義

    這篇文章主要介紹了詳解C++ 中的概念和定義,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下,希望能給你帶來(lái)幫助
    2021-08-08
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生考勤系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)學(xué)生考勤系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生考勤系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++實(shí)現(xiàn)LeetCode(78.子集合)

    C++實(shí)現(xiàn)LeetCode(78.子集合)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(78.子集合),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言實(shí)現(xiàn)彈跳小球項(xiàng)目

    C語(yǔ)言實(shí)現(xiàn)彈跳小球項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)彈跳小球項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語(yǔ)言打印各種圖案實(shí)例代碼

    C語(yǔ)言打印各種圖案實(shí)例代碼

    大家好,本篇文章主要講的是C語(yǔ)言打印各種圖案實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語(yǔ)言文件操作總結(jié)

    C語(yǔ)言文件操作總結(jié)

    本篇文章給大家通過(guò)代碼示例講述了C語(yǔ)言文件操作的相關(guān)知識(shí)點(diǎn),對(duì)此有興趣的朋友可以參考學(xué)習(xí)下。
    2018-03-03
  • 詳解C++ STL中vector擴(kuò)容機(jī)制

    詳解C++ STL中vector擴(kuò)容機(jī)制

    vector是表示可以改變大小的數(shù)組的序列容器,就像數(shù)組一樣,vector對(duì)其元素使用連續(xù)的存儲(chǔ)位置,這篇文章將給大家詳細(xì)介紹C++ STL中vector擴(kuò)容機(jī)制,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • C++?BoostAsyncSocket實(shí)現(xiàn)異步反彈通信的案例詳解

    C++?BoostAsyncSocket實(shí)現(xiàn)異步反彈通信的案例詳解

    這篇文章主要為大家詳細(xì)介紹了C++?BoostAsyncSocket如何實(shí)現(xiàn)異步反彈通信,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-03-03
  • Python繪圖之詳解matplotlib

    Python繪圖之詳解matplotlib

    這篇文章主要介紹了Python繪圖之詳解matplotlib,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++聲明extern變量和extern函數(shù)的用法

    C++聲明extern變量和extern函數(shù)的用法

    extern關(guān)鍵字可以用來(lái)聲明變量和函數(shù)作為外部變量或者外部函數(shù)供其它文件使用,所以本文給大家介紹了C++聲明extern變量和extern函數(shù)的用法,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-11-11

最新評(píng)論