首页 > 其他 > 详细

单链表

时间:2015-10-19 10:40:38      阅读:200      评论:0      收藏:0      [点我收藏+]

1.简介

线性结构用于描述数据元素之间的线性关系,即数据元素一个接一个的排列,主要用于描述具有单一前驱和后继的数据关系。线性表是一种线性结构,它有顺序存储和链式存储两种方法。线性表的链式存储用结点存储数据元素,元素结点可以连续,也可以不连续,因此,存储数据元素的同时必须存储元素的逻辑关系。结点的结构如下:

技术分享

其中,前面为数据域,后面为指针域。若节点中只有一个指针域,则称为单链表(线链表)。在链式存储结构中,只需一个指针指向头一个结点,就可以顺序访问表中任意元素。所以,引入一个不存储元素的结点,称为头结点,并令头指针指向该结点。

2.实例

2.1单链表的前置条件

struct Node           //定义结点
{
    int data;              //数据域
    Node *next;        //指针域
};
class LinkList
{
public:
    LinkList(int a[], int n);        //建立有n个元素的单链表
    int Length();                     //求单链表长度
    void PrintList();                 //遍历单链表,按序号依次输出各元素
    void Insert(int i, int x);      //在单链表的指定位置插入指定数据
    int Get(int i);                    //获取单链表指定位置的元素
private:
    Node *first;                     //单链表的头指针
};

2.1单链表的创建

LinkList::LinkList(int a[], int n)      //建立有n个元素的单链表
{
    first = new Node;              //申请头结点
    first->next = NULL;          //初始化一个空链表
    for (int i = 0; i<n; i++)
    {
        Node *s;             
        s = new Node;                   //申请新结点

        s->data = a[n-1-i];            //给结点数据域赋值
        s->next = first->next;       //这两句将新结点插入到前一个结点之前
        first->next = s;
    }

注:first->next=NULL;申请结点p,则p->next=NULL(语句一),first->next=p(语句二);

     first->next=p;申请结点t,则t->next=p(语句一),first->next=t(语句二);

     first->next=t;申请结点s,则s->next=t(语句一),first->next=s(语句二);

最终,指针表示形式为:first->s->t->p->NULL.

2.2单链表的遍历

void LinkList::PrintList()
{
    Node *p;                 
    p = first->next;           //结点p初始指向头结点的后继结点
    while (p != NULL)        
    {
        cout << p->data << "  ";       //输出对应结点的数据
        p = p->next;                       //结点p变为p的后继结点
    }
    cout << endl;
}

2.3单链表的插入

void LinkList::Insert(int i, int x)            //在第i个位置插入x
{
    Node *p;        
    Node *s;
    p = first;                               //设p为头结点
    int count = 1;                     
    while (p != NULL&&count<i )  
    {
        p = p->next;           //循环直至p为指定位置的前一个结点
        count++;
    }
    if (p == NULL)throw"位置";
    else {
        s = new Node;              //申请新结点
        s->data = x;                //为结点s的数据域赋值
        s->next = p->next;      //新结点的指针指向结点p的后继结点,即位置i上的结点
        p->next = s;                //原先位置i-1上的结点指针改为指向新结点
    }
}

2.4单链表的查询

int LinkList::Get(int i)           //获取第i个位置上的元素
{
    Node *p;
    p=first->next;             //p初始为第一个结点
    int count=1;
    while(p!=NULL&&count<i)
    {
        p=p->next;        //结点后移
        count++;
    }
    if(p==NULL)throw"位置";
    else
        return p->data;
}

2.5单链表的长度

int LinkList:: Length( )       //获取单链表的长度
{
    Node *p;
    p=first->next;
    int count=0;
    while(p!=NULL)
    {
        p=p->next;
        count++;
    }
    return count;
}

2.6主函数

void main( )
{
    int r[5]={1, 9, 7, 2, 5};
    LinkList L(r, 5);
    cout<<"线性表的数据为:"<<endl;
    L.PrintList( );                 
    cout<<endl;    
    cout<<"线性表的数据个数为:"<<endl;
    cout<<L.Length()<<endl;
    cout<<"线性表的第四个数据为:"<<endl;
    cout<<L.Get(4)<<endl;
    cout<<"线性表的第二个位置插入4:"<<endl;
    L.Insert(2,4);
    L.PrintList();
}

技术分享

单链表

原文:http://www.cnblogs.com/jfl-xx/p/4890116.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!