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

来源:互联网 发布:mac os x 10.7 编辑:程序博客网 时间:2024/04/29 08:16

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

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

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

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


优点:

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

缺点:

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

代码:

#include<iostream>using namespace std;#define null 0struct 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 0
原创粉丝点击