数据结构之线性表Word下载.docx

上传人:b****5 文档编号:21140168 上传时间:2023-01-27 格式:DOCX 页数:20 大小:285.26KB
下载 相关 举报
数据结构之线性表Word下载.docx_第1页
第1页 / 共20页
数据结构之线性表Word下载.docx_第2页
第2页 / 共20页
数据结构之线性表Word下载.docx_第3页
第3页 / 共20页
数据结构之线性表Word下载.docx_第4页
第4页 / 共20页
数据结构之线性表Word下载.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数据结构之线性表Word下载.docx

《数据结构之线性表Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构之线性表Word下载.docx(20页珍藏版)》请在冰豆网上搜索。

数据结构之线性表Word下载.docx

StatusInitList_Sq(SqList&

L)

{//构造一个空的线性表

L.elem=(ElemType*)

malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!

L.elem)return(OVERFLOW);

//存储分配失败

L.length=0;

//空表长度为0

L.listsize=LIST_INIT_SIZE;

//初始存储容量

returnOK;

}

按值查找:

找x在表中的位置,若查找成功,返回表项的位置,否则返回-1

intFind(SqList&

L,ElemTypex){

inti=0;

while(i<

L.length&

L.elem[i]!

=x)

i++;

if(i<

L.length)returni;

elsereturn-1;

判断x是否在表中

intIsIn(SqList&

L,ElemTypex)

{inti=0,found=0;

!

found)

if(L.elem[i]!

=x)i++;

elsefound=1;

returnfound;

求表的长度

intLength(SqList&

L){

returnL.length;

提取函数:

在表中提取第i个元素的值

ElemTypeGetData(SqList&

L,inti){

if(i>

=0&

i<

L.length)

returnL.elem[i];

elseprintf(“参数i不合理!

\n”);

▪按值查找:

寻找x的后继

intNext(SqList&

inti=Find(x);

=0&

L.length-1)returni+1;

elsereturn-1;

▪寻找x的前驱

0&

L.length)returni-1;

▪顺序表的插入

intInsert(SqList&

L,ElemTypex,inti){

//在表中第i个位置插入新元素x

if(i<

0||i>

L.length||L.length==ListSize)

return0;

//插入不成功

else{

for(intj=L.length;

j>

i;

j--)

L.elem[j]=L.elem[j-1];

L.elem[i]=x;

L.length++;

return1;

//插入成功

▪顺序表的删除

intDelete(SqList&

//在表中删除已有元素x

inti=Find(L,x);

//在表中查找x

=0){

L.length--;

for(intj=i;

j<

L.length;

j++)

L.elem[j]=L.elem[j+1];

return1;

//成功删除

//表中没有x

顺序表的应用:

集合的“并”运算

voidUnion(SqList&

A,SqList&

B){

intn=Length(A);

intm=Length(B);

for(inti=0;

m;

i++){

intx=GetData(B,i);

//在B中取一元素

intk=Find(A,x);

//在A中查找它

if(k==-1)//若未找到插入它

{Insert(A,x,n);

n++;

集合的“交”运算

voidIntersection(SeqList&

A,SeqList&

n){

intx=GetData(A,i);

//在A中取一元素

intk=Find(B,x);

//在B中查找它

if(k==-1){Delete(A,i);

n--;

elsei++;

//未找到在A中删除它

单链表的类型定义

typedefcharElemType;

typedefstructLNode{//链表结点

ElemTypedata;

//结点数据域

structLNode*next;

//结点链域

}LNode,*LinkList;

LinkListhead;

//链表头指针

算法描述

StatusListInsert(LinkList&

L,inti,ElemTypee){

//在链表l的第i个结点处插入新元素x

ListNode*p=L;

j=0;

while(p!

=NULL&

i-1)

{p=p->

next;

j++;

}//找第i-1个结点

if(p==NULL||j>

i-1){

printf(“无效的插入位置!

//终止插入

ListNode*s=//创建新结点

(ListNode*)malloc(sizeof(ListNode));

s->

data=x;

if(i==1){//插入空表或非空表第一个结点之前

next=L;

//新结点成为第一个结点

L=s;

else{//插在表中间或末尾

s->

next=p->

p->

next=s;

在单链表中删除ai结点

q=p->

p->

next=q->

StatusListDelete(LinkList&

L,inti,ElemType&

e){

//在链表中删除第i个元素,并由e返回其值

ListNode*p,*q;

if(i==1)//删除表中第1个结点

{q=L;

L=L->

next;

p=L;

intj=0;

i-1)

}//找第i-1个结点

if(p->

next==NULL||j>

i-1){//找不到第i-1个结点

printf(“无效的删除位置!

else{//删除中间结点或尾结点元素

q=p->

p->

link=q->

e=q->

data;

free(q);

//取出被删结点数据并释放q

带表头结点的单链表

•表头结点位于表的最前端,本身不带数据,仅标志表头。

•设置表头结点的目的:

简化链表操作的实现。

插入

q->

p->

next=q;

intInsertList_L(LinkList&

//将新元素x插入在链表中第i号结点位置

ListNode*p=Locate(L,i-1);

if(p==NULL)return0;

//参数i值不合理返回0

ListNode*s=//创建新结点

(ListNode*)malloc(sizeof(ListNode));

//链入

intDeleteList_L(LinkList&

//将链表第i号元素删去

ListNode*p,*q

p=Locate(L,i-1);

//寻找第i-1个结点

if(p==NULL||p->

next==NULL)

//i值不合理或空表

q=p->

//删除结点

//释放

前插法建立单链表

从一个空表开始,重复读入数据:

生成新结点

将读入数据存放到新结点的数据域中

将该新结点插入到链表的前端

直到读入结束符为止。

voidcreateListH_L(LinkList&

L){

//逆序输入若干元素的值,建立带表头结点的单链线性表L.

//建立表头结点

L=(LinkList)malloc(sizeof(ListNode));

L->

next=NULL;

charch;

LinkListq;

while((ch=getchar())!

=‘\n’){

q=(listNode*)malloc(sizeof(ListNode));

q->

data=ch;

//建立新结点

next=head->

//插入到表前端

后插法建立单链表

▪每次将新结点加在链表的表尾;

尾指针r,总是指向表中最后一个结点,新结点插在它的后面;

VoidcreateListR_L(LinkList&

L=//建立表头结点

(LinkList)malloc(sizeof(ListNode));

ListNode*q,*r=L;

r->

r=q;

//插入到表末端

}

单链表清空

VoidEmptyList_L(LinkListL){

//删去链表中除表头结点外的所有其它结点

ListNode*q;

while(L->

next!

=NULL){//当链不空时,循环逐个删去所有结点

q=L->

free(q);

//释放

计算单链表长度

intLength_L(LinkListL){

ListNode*p=L->

//指针p指示第一个结点

intcount=0;

=NULL){//逐个结点检测

count++;

p=p->

}

returncount;

按值查找

ListNode*Find(LinkListL,ElemTypevalue){

//在链表中从头搜索其数据值为value的结点

ListNode*p=L->

data!

=value)

returnp;

按序号查找(定位)

ListNode*Locate(LinkListL,inti){

//返回表中第i个元素的地址

0)returnNULL;

intk=0;

k<

i)

k++;

}//找第i个结点

if(k==i)returnp;

//返回第i个结点地址

elsereturnNULL;

静态链表

▪定义

constintMaxSize=100;

//静态链表大小

typedefintListData;

typedefstructnode{//静态链表结点

ListDatadata;

intlink;

}SNode;

typedefstruct{//静态链表

SNodeNodes[MaxSize];

intnewptr;

//当前可分配空间首地址

}SLinkList;

链表空间初始化

voidInitList(SLinkListSL){

SL.Nodes[0].link=1;

SL.newptr=1;

//当前可分配空间从1开始

//建立带表头结点的空链表

for(inti=1;

MaxSize-1;

i++)

SL.Nodes[i].link=i+1;

//构成空闲链接表

SL.Nodes[MaxSize-1].link=-1;

//链表收尾

在静态链表中查找具有给定值的结点

intFind(SLinkListSL,ListDatax){

intp=SL.Nodes[0].link;

//指针p指向链表第一个结点

while(p!

=-1)//逐个查找有给定值的结点

if(SL.Nodes[p].data!

=x)

p=SL.Nodes[p].link;

elsebreak;

returnp;

在静态链表中查找第i个结点

intLocate(SLinkListSL,inti){

0)return-1;

//参数不合理

intj=0,p=SL.Nodes[0].link;

=-1&

i){//循环查找第i号结点

p=SL.Nodes[p].link;

if(i==0)return0;

在静态链表第i个结点处插入一个新结点

intInsert(SLinkListSL,inti,ListDatax){

intp=Locate(SL,i-1);

if(p==-1)return0;

//找不到结点

intq=SL.newptr;

//分配结点

SL.newptr=SL.Nodes[SL.newptr].link;

SL.Nodes[q].data=x;

SL.Nodes[q].link=SL.Nodes[p].link;

SL.Nodes[p].link=q;

//插入

在静态链表中释放第i个结点

intRemove(SLinkListSL,inti){

//找不到结点

intq=SL.Nodes[p].link;

//第i号结点

SL.Nodes[p].link=SL.Nodes[q].link;

SL.Nodes[q].link=SL.newptr;

//释放

SL.newptr=q;

循环链表(CircularList)

循环链表的插入

约瑟夫问题的解法

#include<

iostream.h>

TypedefstructCircleNode{

intindex;

structCircleNode*next;

}CircleNode,*CircList;

CircleListclist=NULL;

voidJosephus(intn,intm){

for(inti=0;

n-1;

i++){//执行n-1次

for(intj=1;

j<

m-1;

j++)clist=clist->

next;

printf(“Deleteperson:

%d”,clist->

next->

data);

//数m-1个人

q=clist->

clist->

next=clist->

//删去

free(q);

clist=clist->

voidmain(){

intn,m;

printf(“EntertheNumberofContestants?

”);

scanf(“%d,%d”,&

n,&

m);

CircleListr=NULL;

for(inti=1;

=n;

i++)//形成约瑟夫环

{CircleLists=(CircleNode*)

malloc(sizeof(CircleNode));

data=i;

if(r==NULL){clist=s;

next=s;

r=s;

else{r->

next=clist;

Josephus(n,m);

//解决约瑟夫问题

多项式及其相加

•在多项式的链表表示中每个结点增加了一个数据成员link,作为链接指针。

•优点是:

–多项式的项数可以动态地增长,不存在存储溢出问题。

–插入、删除方便,不移动元素。

多项式链表的相加

AH=1-10x6+2x8+7x14

BH=-x4+10x6-3x10+8x14+4x18

Polynomialoperator+(constPolynomial

&

ah,constPolynomial&

bh){

Term*pa,*pb,*pc,*p;

ListIterator<

Element>

Aiter(ah.poly);

Biter(bh.poly);

//建立两个多项式对象Aiter、Biter

pa=pc=Aiter.First();

//pa检测指针

pb=Biter.First();

//pb检测指针

pa=Aiter.Next();

pb=Biter.Next();

//pa,pb越过表头结点

deletepb;

while(Aiter.NotNull()&

Biter.NotNull())

switch(compare(pa→exp,pb→exp)){

case'

='

:

pa→coef=pa→coef+pb→coef;

p=pb;

pb=Biter.Next();

deletep;

if(!

pa→coef){

p=pa;

}

else{

pc→link=pa;

pc=pa;

}

break;

<

'

pc→next=pb;

pc=pb;

pb=Biter.Next();

break;

case'

>

pc→next=pa;

pa=Aiter.Next();

if(Aiter.NotNull())pc→next=pa;

elsepc→next=pb;

双向链表(DoublyLinkedList)

双向循环链表的定义

typedefstructdnode{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1