数据结构C++版-线性表

 

PS:资料来源慕课网视频。

 

一、什么是线性表

线性表是n个数据元素的有限序列。

 

分类:

 

 

 

二、补充知识点


1、栈和队列有出操作、入操作,对应线性表(数组)为插入元素和删除元素,而线性表中要获取指定元素值可直接使用getelem()函数,获取后并不删除元素,可重复获取。

【与只能使用一次的栈、队列有区别】

 

2、顺序表:遍历和寻址非常快,插入、删除效率低。

 

3、《链表算法说明》课程评论:静态链表基于数组,动态链表基于结构体,所以线性表中的链表也有顺序存储结构

 


4、《链表编码实战一》课程笔记:

单链表中第一个节点的数据域是没有意义的!!!因为这是一个哨兵节点,没有别的指针指向这个头节点的数据域。并且头节点并不算在链表的长度当中!

 


5、《链表编码实战一》课程笔记:

初始化的过程是建立头结点,而且与顺序表不同的是,链表的表长size是不需要预先定义的,因为他可以从堆中临时申请,这点与顺序表有很大的不同。

按通用的做法,指向头结点的指针(即头指针)是固定的,头结点是不固定的,头结点不放元素,只放链表第一个结点的地址。

如果新插入或者删除的元素不是链表的第一个带元素的结点,或者这个位置的结点,头结点就是固定的。

如果新插入一个结点到头结点的下一个结点,或者删除头结点的下一个结点,头结点中存放的指针就变了,头结点也就变了。

 

6、《链表编码实战三》课程笔记:

哨兵节点(sentinel)是一个哑元节点(dummy node),可以简化边界条件。是一个附加的链表节点,该节点作为第一个节点,它的值域中并不存储任何东西,

只是为了操作的方便而引入的。如果一个链表有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点。

 


7、《链表编码实战四》课程笔记:

单链表是有表头结点的,表头结点并不存储数据,只是一个牵头作用,方便我们通过它来寻找到链表的其他所有元素。

因此单链表的元素个数也不把它包括在内,第0个结点就是表头结点的下一个结点。

 

三、应用实例-通讯录

 

#include <stdlib.h>
#include <iostream>
#include <string>
#include "List.h"
#include "NodeList.h"
using namespace std;

int menu();
void newPerson(NodeList *p);
void deletePerson(NodeList *p);

void main ( )
{ 
    int userorder=0;
    NodeList p;

    while(userorder!=4)
    {
        userorder=menu();
        switch(userorder)
        {
        case 1:
            cout<<"用户指令-----新建联系人"<<endl;
            newPerson(&p);
            break;
        case  2:
            cout<<"用户指令-----删除联系人"<<endl;
            deletePerson(&p);
            break;
        case 3:
            cout<<"用户指令-----浏览通信录"<<endl;
            p.listTraverse();
            break;
        case 4:
            cout<<"用户指令-----退出通信录"<<endl;
            break;
        default:
            break;
        }
    }    
    
    system("pause");
    
} 




int menu()
{
    cout<<"功能菜单"<<endl;
    cout<<"1.新建联系人"<<endl;
    cout<<"2.删除联系人"<<endl;
    cout<<"3.浏览通信录"<<endl;
    cout<<"4.退出通信录"<<endl;
    cout<<"请输入:";
    int order;
    cin>>order;
    return order;
}



void newPerson(NodeList *p)
{
    Node node;
    cout<<"请输入姓名:"<<endl;
    cin>>node.data.m_strName;
    cout<<"请输入电话号码:"<<endl;
    cin>>node.data.m_strCode;
    p->listInsertTail(&node);
}



void deletePerson(NodeList *p)
{
    Node node;
    cout<<"请输入姓名:"<<endl;
    cin>>node.data.m_strName;
    cout<<"请输入电话号码:"<<endl;
    cin>>node.data.m_strCode;

    int temp;
    temp=p->locateElem(&node);
    if (temp==-1)
    {
        cout<<"该联系人不存在"<<endl;
        return;
    }
    Node t;
    p->listDelete(temp,&t);
    cout<<"成功删除联系人"<<endl;
}

 

posted @ 2018-08-29 22:58  eeeeeeee鹅  阅读(1611)  评论(0编辑  收藏  举报