关闭

C++基础---链表

标签: C++链表结构体和类的区别静态链表动态链表动态链表的相关操作
615人阅读 评论(1) 收藏 举报
分类:

1. 链表

1.1 C++中的结构体和类的区别

  • 在C++中,结构体与类基本相同,唯一不同的是:
    (1)结构体:成员默认为公有成员
    (2)类:成员默认为私有成员

1.2 链表的定义

  • 链表:是一种物理存储单元上非连续、非顺序的存储结构
  • 链表:一系列结点(链表中每一个元素称为一个结点)组成
  • 链表:它解决了数组(就像容器)不可调节大小的缺陷,它可以将一个容器分解成若干个小容器,每一个小容器放入合适大小的元素,然后根据需要将它们链接起来

1.3 链表元素的定义

  • 链表中数据元素的逻辑顺序:是通过链表中的指针链接次序实现的。
  • 链表中每个元素(结点)包括两个部分:
    (1)存储数据元素的数据域
    (2)存储下一个结点地址的指针域
  • 声明一个链表结构,如:

    struct book
    {
        int num; float price; //数据域
        book *next; //指针域
    }
    <=>等价于
    class book
    {
    public: 
        int num; float price; //数据域
        book *next; //指针域
    }

1.4 静态链表

  • 静态链表:链表中所有结点的数据内存中的分布都是在编译时就确定好了的,程序运行后不能进行改动
  • 代码示例:静态链表的实现

    
    #include <iostream>
    
    using namespace std;
    struct book
    {
        int num; float price; //数据域
        book* next; //指针域
    }
    void main()
    {
        book x, y, z, *head, *p;
        x.num = 10000; x.price = 14.7; 
        y.num = 10005; y.price = 12.7; 
        z.num = 10008; z.price = 44.7; 
        head = &x;//将x变量结构的开始地址作为一个结点赋给头指针head
        x.next = &y;//将y变量结构的开始地址作为一个结点赋给x变量结构的next指针成员
        y.next = &z;//将z变量结构的开始地址作为一个结点赋给y变量结构的next指针成员
        z.next = NULL;//将z变量结构的next指针成员赋为空,即表示该结点是个尾结点
        p = head;//将p指针指向头结点head
        while(p)
        {
            cout<<p->num<<"\t"<<p->price<<endl;
            p = p->next;
        }
        system("pause");
    }

1.5 动态链表

  • 动态链表:链表结构也可以是动态地分配存储的,即在需要时才开辟结点的存储空间
    注:动态链表的操作中将只使用new和delete。如:
    book* p = new book;
    delete p;
  • 示例代码:动态链表的创建

    
    #include <iostream>
    
    
    #include <string> 
    
    using namespace std;
    struct book
    {
        int num; float price; //数据域
        book* next; //指针域
    }
    book* head = NULL; //声明了一个指向book结构的全局指针变量head
    book* creat()
    {
        book *p1, *p2;
        p1 = new book; //在堆中新建了一个book类对象或叫结点,并将指针p1指向它
        head = p1;
        p2 = p1;
        cout<<"请输入图书的编号,以0结束"<<endl;
        cin>>p1->num;
        if (p1->num!=0)
        {
            cout<<"请输入图书的价格"<<endl;
            cin>>p1->price;
        } 
        else
        {
            delete p1;
            p2 = NULL;
            head = NULL;
            return head;
        }
        while(p1->num != 0)
        {
            p2 = p1; //用p2来保存p1的地址,也就是上次创建成功结点的位置
            p1 = new book; //作为下一个节点的指针p1
            cout<<"请输入图书的编号,以0结束" <<endl;
            cin>>p1->price;
            if (p1->num!=0)
            {
                cout<<"请输入图书的价格"<<endl;
                cin>>p1->price;
            } 
            p2->next = p1; //将p1的值付给p2->next,由于目前p1所指向的是个新结点,而p2指向的是第1个结点,因此p2->next = p1也就是将新结点的地址赋给第1个结点的next指针成员
        }
        delete p1; //会删除掉最后一次创建的结点
        p2->next = NULL; //将最后一次创建的结点的上一个结点的next成员赋为空,这样该结点就变成了尾结点,它不再指向任何结点
        return head;
    }
    void main()
    {
        creat();
    }
  • 示例代码:遍历显示动态链表

    void Showbook(book* head)
    {
        while(head)
        {
            cout<<head->num<<"\t"<<head->price<<endl;
        }
    }
  • 示例代码:删除动态链表中的指定结点

    void DeleteNode(book* head, int num)
    {
        book* l;
        if (head->num == num) 
        {
            l = head; //将头结点的地址赋给指针l
            head = head->next; //用头指针head来访问第1个结点的next成员,并将next成员所存放的第2个结点的地址赋给head,这样head就指向了第2个结点
            ::head = head; //跟着在将head的值赋给全局的head
            cout<<"操作成功"<<endl;
            return;
        }
        while (head)
        {
            if (head->next == NULL)
            {
                cout<<"找不到要删除的编号。"<<endl;
                return;
            }
            if (head->next->num == num) 
            {
                l = head->next;
                head->next = l->next;
                delete l;
                cout<<"操作成功"<<endl;
                return;
            }
            head = head->next; //进入下一次循环
        }
        cout<<"找不到要删除的编号。"<<endl;
    }
  • 示例代码:在动态链表尾端插入结点

    void InsertNode(book* head, int num, float price)
    {
        book* l;
        book* list = new book;
        while (head)
        {
            l = head;
            head = head->next;
        }
        list->num = num;
        list->price = price;
        list->next = NULL;
        l->next = list; //在尾端插入结点list
    }
  • 示例代码:统计动态链表总结点数

    int CountNode(book* head)
    {
        int count = 0;
        while (head)
        {
            count++;
            head = head->next;
        }
        return count;
    }

参考文献:
[1]《C++全方位学习》范磊——第十五章
[2] 百度搜索关键字:C++链表、结构体与类的区别、链表元素、静态链表、动态链表

1
0
查看评论

C++实现链表基本操作

前几天找实习的时候,一个面试官给我留了一个题,做一个链表demo,要求实现创建、插入、删除等操作。 链表是一种常见的数据结构,它是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成...
  • Kevin_zhai
  • Kevin_zhai
  • 2016-01-10 21:56
  • 37028

C++链表使用完整代码

 /**//*    练习使用链表:创建链表、遍历链表、查找节点、添加节点、删除节点*/#include "stdio.h"#include "string.h"#include ...
  • hizxc
  • hizxc
  • 2008-03-01 00:29
  • 59310

C++单链表的构建以及总结

c++单链表的构建 顺路复习深浅拷贝、内存泄漏和引用的问题
  • luojj26
  • luojj26
  • 2016-03-13 18:10
  • 2169

用C++写一个链表

基本数据结构:链表(list) 作者:C小加 更新时间:2012-7-31 谈到链表之前,先说一下线性表。线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表有两种存储方式,一...
  • wujiangming7
  • wujiangming7
  • 2016-03-14 15:14
  • 19242

链表C++实现

节点定义:typedef struct node { int data; struct node *next; }NODE;类定义class LinkList { private: NODE *head; public: LinkList() { head = NUL...
  • starstar1992
  • starstar1992
  • 2017-03-03 01:11
  • 4991

C++ 链表

链表
  • wuan584974722
  • wuan584974722
  • 2014-11-14 00:19
  • 2485

C++链表操作总结和常见链表操作

链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地...
  • fanyun_01
  • fanyun_01
  • 2017-02-26 21:13
  • 1554

【C++】链表入门

1.结点 链表中用来存储一个数据的存储单元。 一个链表至少需要由两部分组成,就是数据域和指针域,一般形式的结点定义为: struct node { Elem data; //Elem类型泛指基本数据类型 struct node *next; } typedef struct node Elemsn;...
  • linghugoogle
  • linghugoogle
  • 2016-09-26 11:26
  • 865

C++链表学习笔记

如果要保存一些数据类型相同的变量,比如过n个int类型的变量,就可以存放在一个数组中,然后通过下标方便的访问。可是数组的缺点也比较多,第一个就是在声明数组的时候,数组的长度必须是明确的,即便是动态声明一个数组,处理器必须要知道长度才能在内存中找出一段连续的内存来保存你的变量。第二个缺点也就是上一句中...
  • u011411195
  • u011411195
  • 2016-04-15 15:03
  • 4442

C++链表的创建与操作

我们知道,数组式计算机根据事先定义好的数组类型与长度自动为其分配一连续的存储单元,相同数组的位置和距离都是固定的,也就是说,任何一个数组元素的地址都可一个简单的公式计算出来,因此这种结构可以有效的对数组元素进行随机访问。但若对数组元素进行插入和删除操作,则会引起大量数据的移动,从而使简单的数据处理变...
  • u011391629
  • u011391629
  • 2016-08-06 17:26
  • 5024
    个人资料
    • 访问:274052次
    • 积分:6216
    • 等级:
    • 排名:第4737名
    • 原创:158篇
    • 转载:0篇
    • 译文:0篇
    • 评论:24条