简单链表及其应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
. 创建无序链表
一个链表是有若干个结点连接而成,创 建链表实际上是创建链表中的各个结点, 并将它们连接起来。 函数nosorted_create( )实现创建链表, 其算法为:如果链表为空(head==0), 则将该结点设置为表头;如果链表非空, 则将该结点加入到链表的末尾。
将结点设置为表头的过程如下图所示:
. 统计链表结点的个数
int node_count(node* head) { node* temp=head; int count=0; while(temp!=0)
{ count++;
temp=temp->next; } return count; }
. 访问链表尾结点
node* accessTail(node* head) { if(head==0) return 0;
.链表的删除
void deletelist(node* &head) { node* temp; while(head)
{
temp=head; head=head->next; delete temp; }
}来自百度文库
.无序链表的排序
void convert() { int temp,i,j; node* pcur=head; for(i=1;i<node_count(head);i++) { for(j=1;j<=node_count(head)-i;j++) { if(pcur->data>pcur->next->data) { temp=pcur->data; pcur->data=pcur->next->data; pcur->next->data=temp; } pcur=pcur->next; } pcur=head; } }
data 0
头结点
data next
…
结点n
data
next
next
0
head pEnd (a) 结束前 pNew=new node; pNew
head pEnd (b) 结束后 pEnd->next=0; delete pNew;
. 链表的输出
void ShowList(node* head) { if(head==0)
{ cout<<"List is empty!"<<endl;
return; } node *temp=head; cout <<"now the items of list are: \n";
while(temp!=0){
cout <<temp->data<<endl; temp=temp->next; } }
单链表 (Singly Linked List)
特点 存储后继结点 存储地址 存储数据元素 每个元素(表项)由结点(Node)构成。
data
link
a2
空指针
头结点 线性结构
head
a0
a1
a3
a4
结点可以不连续存储 表可扩充
单链表的存储映 像
free (a) 可利用存储空间
.创建有序链表 所谓有序链表,是指链表中的结点按结点的 某个成员的大小进行排列。 将一个结点插入到有序链表中时,为了保 持有序性,要判断插入的位置。函数 insert_sort_node(node* & ,node* &) 。 通过上述插入函数,可以创建一个有序链 表。 函数 sorted_create() 。
…
结点n data
结点n+1 data
next
next
next
next
head pEnd (a) 加入前 pNew=new node; pNew
head pEnd pNew
(b) 加入后 pEnd->next=pNew; pEnd=pNew;
链表创建结束
… …
头结点
data next
…
结点n 新结点
(插入后)
第二种情况:在第一个结点前插入
newnode->next = head ; head = newnode;
newnode newnode head
head
(插入前)
(插入后)
第三种情况:在链表中间插入 newnode->next = current->next; current->next = newnode;
简单链表及其应用
链表是指将一组同类型数据(通常为结构体类
型)按其特有的方式连接在一起的一种数据结构。 链表中的元素称为结点。每一个结点都包含两 类数据:一类数据称为结点的值域,它是描述该 结点所包含的实际数据,可以由多个不同类型的 数据构成;另一类数据称为链域,它用来存储与 本结点相邻的结点的地址,其作用是将各个结点 连接在一起,它通常是与结点同类型的指针。 任何一个链表都一个起始指针,称为该链表的 头指针(head)。 链表的最后一个结点称为尾结点,它的链域指 针不指向任何结点,通常将它设置为空指针。
. 链表某个结点的访问
node* access(node* head,int n) { if(head==0) { cout<<"List is empty!"<<endl; return 0;} node *temp; temp=head; for(int i=1;i<n;i++) { if(temp->next==0) { cout<<“要访问的结点数大于链表的结点数.”<<„\n‟; return 0; } temp=temp->next; } return temp; }
newnode current newnode current
(插入前)
(插入后)
第四种情况:在链表末尾插入 tail->next = newnode; newnode->next = 0;
newnode tail newnode tail
(插入前) (插入后)
.无序链表结点的删除
第一种情况: 删除表中第一个元素
//值域 //链域
例. 建立一个简单的链表,它由3个学生数据的结点组成, 输出各结点中的数据。 #define NULL 0 p=head; struct student do { long num; { cout<<p->num<<p->score; float score; p=p->next; student *next; }while(p!=NULL);} }; void main() {student a,b,c,*head,*p; a.num=99101; a.score=89.5; b.num=99103; b.score=90; c.num=99107; c.score=85; head=&a; /*将结点a的起始地址赋给头指针head*/ a.next=&b; /*将结点b的起始地址赋给a结点的next成员*/ b.next=&c; c.next=NULL;
head pNew head
头结点 pEnd
pEnd pNew
(a) 加入结点前 head=0; pEnd=pNew;
(b) 加入结点后 head=pNew; pEnd=pNew;
将结点加到链表末尾的过程如下图所示:
… …
头结点
data next
…
结点n 新结点
data data
头结点 data next
node* temp=head;
while(temp->next!=0) temp=temp->next; return temp; }
.无序链表的插入
第一种情况:插入一个空表 head = newnode; head->next=0;
newnode head newnode head
^
(插入前)
head
a1 a1
a2
删除前
a3 a3
head
a2
删除后
pcur=head;head=head->next; delete pcur;
第二种情况: 删除表中或表尾元素
ai-1
ai-1 p
ai 删除前 ai q 删除后
ai+1 ai+1
p->next=q->next; delete q;
…… 200 …… 135 170 …… Null 130 110 …… 205 160 ……
头指针 head 165
135 …… 160 165 170 …… 200 205 ……
head
bat eat … cat mat ^
用C++语言描述的一个简 单的单链表如下: struct node{ int data; node *next; };
a0 a2 a1 a3
free head (b) 经过一段运行后的单链表结构
head 2000 2000 A 2114 2114 B 2056 2056 C NULL
某单链表示意图如下:
…… 110 …… 130
……… hat ……. cat eat …. mat bat fat …… jat lat ……