线性表的链接存储——单链表

单链表是用一组任意的存储单元存放线性表的元素。

1.为了能正确表示元素之间的逻辑关系,没个存储单元在存储数据元素的同时,还必须存储其后继元素所在的地址信息,这个地址信息称为指针,这两部分组成了数据元素的存储映像,称为结点

2.单链表中每个结点的存储地址存放在其前驱结点的next域中,而第一个元素无前驱,所以设头指针(head pointer)指向第一个元素所在结点(称为开始结点),整个单链表的存取必须从头指针开始进行,因而头指针具有标识一个单链表的作用。

3.由于最后一个元素无后继,故最后一个元素所在结点(称为终端结点)的指针域为空,即Null,也称尾标志。


优点:

静态分配存储(顺序表)变为动态分配存储(单链表,循环双链表)

缺点:

必须从头指针开始遍历整个链表

代码:

#include<iostream>

using namespace std;

#define null 0

struct Node
{
    int data;
    Node *next;
};

class LinkList
{
private:
    Node *first;
public:
    LinkList();
    LinkList(int a[],int n);
    ~LinkList();
    int Length();
    int Get(int i);
    int Locate(int x);
    void Insert(int i,int x);
    int Delete(int i);
    void PrintList();
};

LinkList::LinkList()
{
    first=new Node;
    first->next=null;
}
LinkList::LinkList(int a[],int n)
{
     /*//头插法
    first=new Node;
    first->next=null;
    for(int i=0;i<n;i++)
    {
        Node *s=new Node;
        s->data=a[i];
        s->next=first->next;
        first->next=s;
    }*/

   //尾插法
    first=new Node;
    Node *r=first;
    for(int i=0;i<n;i++)
    {
        Node *s=new Node;
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=null;
}

LinkList::~LinkList()
{
    Node *q=new Node;
    while(first!=null)
    {
        q=first;
        first=first->next;
        delete q;
    }
}

int LinkList::Length()
{
   int c=0;
   Node *q=new Node;
   q=first->next;
   while(q!=null)
   {
       c++;
       q=q->next;
   }
   return c;
}

int LinkList::Get(int i)
{
    Node *p=new Node;
    p=first->next;
    int c=1;
    while(p!=null && c<i)
    {
       p=p->next;
       c++;
    }
    if(p==null) throw "位置";
    else return p->data;
}

int LinkList::Locate(int x)
{
    Node *p=new Node;
    p=first->next;
    int c=1;
    while(p!=null && p->data!=x)
    {
        p=p->next;
        c++;
    }
    if(p==null) throw "位置";
    else return c;
}

void LinkList::Insert(int i,int x)
{
    Node *p=new Node;
    p=first->next;
    Node *q=new Node;
    q->next=null;
    q->data=x;
    int c=1;
    while(p!=null)
    {
        if(c==i-1)
        {
            q->next=p->next;
            p->next=q;
            break;
        }
        else
        {
            p=p->next;
            c++;
        }
    }
}

int LinkList::Delete(int i)
{
    Node *p=new Node;
    p=first->next;
    int c=1;
    while(p!=null && c!=i-1)
    {
        p=p->next;
        c++;
    }
    if(p==null || p->next==null) throw "位置";
    Node *q=new Node;
    q=p->next;
    int x=q->data;
    p->next=q->next;
    delete q;
    return x;

}

void LinkList::PrintList()
{
    Node *p=new Node;
    p=first->next;
    while(p!=null)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
int main()
{
    int a[10]={1,5,2,8,6,0,4,3,7,11};
    LinkList ll(a,10);
    ll.PrintList();

    cout<<ll.Length()<<endl;

    cout<<ll.Get(3)<<endl;

    cout<<ll.Locate(0)<<endl;

    ll.Insert(3,20);
    ll.PrintList();

    cout<<ll.Delete(3)<<endl;
    ll.PrintList();

    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值