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

來源:互聯網
上載者:User

鏈表一直是面試的高頻題,今天先總結一下單鏈表的使用,下節再總結雙向鏈表的。本文主要有單鏈表的建立、插入、刪除節點等。

1、概念

單鏈表是一種鏈式存取的資料結構,用一組地址任意的儲存單元存放線性表中的資料元素。

鏈表中的資料是以結點來表示的,每個結點的構成:元素 + 指標,元素就是儲存資料的儲存單元,指標就是串連每個結點的地址資料。如下圖:

2、鏈表的基本操作

SingleList.cpp:

#include "stdafx.h"#include "SingleList.h"#include <cstdlib>#include <iostream>#include <string.h>#include <conio.h>#include <stdio.h>/*c++實現簡單的單鏈表操作*/using namespace std;SingleList::SingleList(){  int num;  char name[128];  // 建立鏈表  node *stuList = CreatNode();  PrintList(stuList);  // 插入節點  printf("\n請輸入要插入的學生學號和姓名,輸入0 0表示結束.");  scanf_s("%d%s", &num, name, 100);  stuList = InsertNode(stuList, num, name);  PrintList(stuList);  // 刪除節點  printf("\n請輸入要刪除的學生學號:");  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));  // 為頭結點分配記憶體空間  head->next = nullptr;  p = head;    // p指向前端節點  while (cycle)  {    printf("\n請輸入學生的學號和姓名:");    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;    // 指向新插入的節點      p = s;    // p指向當前節點    }    else    {      cycle = 0;    }  }  head = head->next;  p->next = NULL;  printf("前端節點學生資訊為: %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)    {      // 插入首節點      s->next = p1;      head = s;    }    else    {      // 插入中間節點      p2->next = s;      s->next = p1;    }  }  else  {    // 插入尾節點    p1->next = s;    s->next = NULL;  }  return head;}// 計算單鏈表長度int SingleList::GetLength(node *head){  int length = 0;  node *p;  p = head;  while (p != NULL)  {    p = p->next;    length++;  }  return length;}//單鏈表刪除某個元素 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("找不到學號為%d 的學生!\n", num);  }  return head;}//單鏈表逆序node *SingleList::ReverseList(node *head){  // A->B->C->D  node *old_head;    // 原來鏈表的頭  node *new_head;    // 新鏈表的頭  node *cur_head;    // 獲得原來鏈表的頭  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;    // 將原來鏈表的頭取出,並將第二個節點作為前端節點    cur_head->next = new_head;  // 將取出的頭設為新鏈表的頭    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 個學生的資訊:\n", n);  p = head;  while (p != NULL)  {    printf("學號: %d ,姓名: %s\n", p->num, p->name);    p = p->next;  }}

SingleList.h:

#pragma oncetypedef struct student{  int num;        // 學號  char name[128]; // 姓名  struct student *next;}node;class SingleList{public:  SingleList();  ~SingleList();  //建立單鏈表   node *CreatNode();  //單鏈表插入  node *InsertNode(node *head, int num, char* name);  // 計算單鏈表長度  int GetLength(node *head);  //單鏈表刪除某個元素   node *DeleteNode(node *head, int num);  //單鏈表逆序  node *ReverseList(node *head);  //列印單鏈表  void PrintList(node *head);};

關於逆序邏輯,研究了一下:

1、主要思路:

假設有單鏈表A->B->C->D,首先取出首節點A作為新逆序出來的鏈表

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

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

2、圖形表示:

  原始的單鏈表:

  
<!--[endif]-->

初始狀態時,單鏈表如上圖所示,head指向前端節點A。

1. 取出原始鏈表的第一個節點A,然後將該節點作為新鏈表的前端節點

原始鏈表:

  
<!--[endif]-->

  新鏈表:

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

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

 原始鏈表:

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

  新鏈表:

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

以上這篇C++ 單鏈表的基本操作(詳解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援雲棲社區。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.