线性表的链接存储——单链表
来源:互联网 发布: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
- 线性表的链接存储——单链表
- 线性表的链接存储——循环双链表
- 线性表的链接存储结构(单链表)的实现
- 线性表的链接存储结构-单向链表
- 线性表的链接存储结构-双向链表
- 线性表的链接存储结构及JAVA实现
- 线性表的链式存储结构——单链表
- 数据结构——线性表(一)线性表的顺序存储和单链表
- 线性表—链式存储
- 线性表的存储
- 线性表的存储
- 【三十一】 数据结构——线性表的存储的实现
- 线性表的存储结构————链表
- 线性表的顺序存储结构——顺序表
- 线性表的顺序存储——顺序表
- 线性表的顺序存储——顺序表
- 线性表的顺序存储——顺序表
- 线性表的单链表存储结构
- 22_JSP 自动刷新
- SSH框架应用解析
- 线程的基本概念状态和之间的关系
- 23_JSP 发送邮件
- Javascript复习第五天几种对象的创建方式
- 线性表的链接存储——单链表
- virsh console和shutdown的两个补充
- iOS--UINavigationController学习笔记三
- 《java入门第一季》之Math类一个小案例获取任意数值范围内随机数
- [3.1]Spark Streaming初体验之NetworkWordCount案例完美解读
- Volley源码解析——从实现角度深入剖析volley
- 24_JSP 标准标签库(JSTL)
- 25_JSP 连接数据库
- iOS引用计数