线性表的基本操作讲解Word格式文档下载.docx
《线性表的基本操作讲解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《线性表的基本操作讲解Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
scanf(,z%d,\&
n);
for(i二0;
i<
=n;
i++)
{printf("
list[%d]二"
,i);
scanf(”%d"
&
list[i]);
printf(z,Thelistbeforeinsertionis\n"
i++)printf(z,%dz,,list[i]);
\n"
printf("
pleaseinputthepositionwhereyouwanttoinsertavalue\nposition=〃);
scanf(,z%d,z,&
i);
pleaseinputthevalueyouwanttoinsert・\nx=z,);
scanf(,z%d,z,&
x);
temp=sq_insert(list,&
n,i,x);
switch(twmp)
{case0:
printfC'
Theinsertionissuccessful!
\n"
Thelistisafterinsertionis\n"
for(i=0;
i++)printf("
%d"
Jist[i]);
printf(“%d\n"
n);
break;
case1:
case2:
Theinsertionisnotsuccessful!
\n,z);
/*deleting*/
Thelistbeforedeletingis\n"
pleaseinputthepositionwhereyouwanttodeleteavalue\nposition=〃);
temp=sq_delete(list,&
n,i);
printfC'
Thedeletingissuccessful!
\nz/);
Thelistisafterdeletingis\n"
printf(“%d"
Thedeletingisnotsuccessful!
,z);
2.分析并运行以下各子程序的主要功能。
程序2链式存储的线性表和运算
#include〈malloc・h>
struetnode{
chardata;
structnode*next;
};
typedefstructnodeNODE;
/♦Thisfunctioncreatesalink.listwithNnodes.♦/
NODE*create_link_list(intn)
{inti;
NODE*head,*p,*q;
i.f(n==0)returnNULL;
head二(NODE*)malloc(sizeof(NODE));
p=head;
Pleaseinput%dcharsforthelinklist\n"
n;
{scanf(,z%c"
、&
(p~>
data));
q=(NODE*)malloc(sizeof(NODE)):
test3\n"
p~>
next二q;
P二q;
scanf(,z%c"
(p->
getchar0;
p->
next二NULL;
:
return(head);
/♦Thisfunctioninsertsanodewhosevalueisb*/
/♦beforethenodewhosevalueisa,ifthenodeisnotexist,*//♦theninsertiterttheendofthelist*/
voidinsert(NODE**p_head,chara,charb)
{NODE*p,*q;
q=(NODE*)malloc(sizeof(NODE));
q~>
data=b;
next二NULL;
if(*p_head=NULL)*p_head=q;
else
{p=(N0DE*)malloc(sizeof(NODE));
p=*p_head:
while(p~>
data!
=a&
&
p->
next!
=NULL)
p=p"
>
next;
next=p->
next二q;
/♦Thefunctiondeletesthenodewhosevalueisa,♦/
/*ifsuccess,return0,orreturn1*/
intdeletenode(N0DE**p_head,chara)
q=*p_head;
if(q==NULL)return
(1);
if(q"
data==a)
{*p_head=q~>
free(q);
return(0);
{whi.le(q~>
q~>
{p=q;
q=q"
if(q->
{p->
next二q->
elsereturn(l);
{NODE*my_head,*p:
/*createalinklistwithmnodes*/
intm;
charch_a,ch_b;
pleaseinputthenumberofnodesforthelink_list\nm二"
);
scanf;
printf(/ztestl\n"
my_head=(NODE*)malloc(sizeof(NODE));
my_head=create_link_list(m);
/♦Outputthelinklist♦/
printf(〃Thelinklistislike:
\nz,);
p=my_head;
while(p!
$c"
、p~>
data);
p=p~>
/♦insertanodewhosevalueisbbeforea*/
Pleaseinputthepositionfora\nch_a="
scanf(,z%c,z,&
ch_a);
Pleaseinputthevaluethatyouwanttoinsert\nch_b="
scanf(,z%c,z,&
ch_b);
insert(&
my_head,ch_a,ch_b);
printf(〃Thelinklistafterinsertionislike:
\nz,);
p=my_head;
、p*>
/♦deleteanodewhosevalueisa*/
Pleaseinputthepositionforaa="
deletenode(&
my_head,ch_a);
printf(〃Thelinklistafterdeletingislike:
\n,z);
printf(〃\n"
3.运行以下程序并分析各子函数的主要功能。
^include<
stdio.h>
stdlib.h>
stmcttagNode
{
intdata;
stmcttagNode*pNext;
tvpedefstmcttagNode*pNode;
〃将结点插入到链表的适当位置,这是一个降序排列的链表//
voiduisertList(pNodehead,//链表头结点
pNodepnode)//要插入的结点
pNodepPri=head;
while(pPri->
pNext!
=NULL)
if(pPri->
pNext->
data<
pnode->
data)
pNext=pPri->
pNext;
pPri->
pNext=pnode;
pPri=pPri->
pNext==NULL)//如果要插入的结点最小
pPri->
〃输出链表
voidprmtLuikedList(pNodehead)
pNodetenip=head->
while(temp?
=NULL)
prmtf(n%dM,temp->
temp=temp->
〃从链表中删除结点
voiddelfoiniList(pNodehead,mtdata)
while(temp!
if(temp->
data==data)
pNext=temp->
fiee(temp);
pPri=temp;
temp=temp・>
pNodehead=(pNode)malloc(sizeof(stnicttagNode));
//给头指l|•分配空间pNodepTemp=NULL;
inttemp;
head->
pNext=NULL;
//比较好的习惯就是分配好空间,马上赋值
prmtf("
请输入要放入链表中的数据,以-1结尾:
”);
〃读入数据,以-1结尾,把数据插入链表中scanf(H%cl,\&
temp);
=-l)
pTemp=(pNode)nialloc(sizeof(sti-ucttagNode));
pTemp
pTemp->
msertList(head,pTemp);
scanf(”%cT:
2mp);
pnntf(”降序排列的链表为:
\n“);
printLiiikedList(head);
〃下面的代码当删除函数编写成功后,可以取消注释,让其执行,主要是调用函数实现链表结点的删除
〃pnntf(”请输入要删除数,以-1结尾:
//scanf(n%d,\&
//wlule(temp!
〃{
delfbrniList(head.temp);
//scaiif(M%d,\&
〃}
〃pnntf(”删除节点后,链表中剩余数据为:
”);
//printLuikedList(head);
//pnntW);
!
1!
、思考与提高
试将以上链表改为有序表,并分析有序表有哪些显著的优点和缺点?
库函数载和常量定义:
(代码,C++)
#iiiclude<
iostieam>
usingnamespacestd;
constmtMaxSize=100;
(1)顺序表存储结构的定义(类的产明上、代码)template<
classdatatype>
〃定义模板类SeqList
classSeqList
public:
SeqList();
〃无参构造函数
SeqList(datatypea[],iiitn);
〃有参构造函数
-SeqListQ{};
〃析构函数为空
mtLengthQ;
〃求线性表的长度
datatypeGet(mt1);
〃按位查找,取线性表的第i个元素
iiitLocate(datatypeitem);
〃查找元素item
voidIiiseit(mti,datatypeitem);
〃在第i个位置插入元素itemdatatypeDelete(mti);
//删除线性表的第i个元素
voiddisplayO;
//遍历线性表,按序号依次输岀各元素private:
datatypedata[MaxSize];
〃存放数据元素的数组
mtlengtli;
〃线性表的长度
};
(2)初始化顺序表算法实现(不带参数的构造函数)严
*输入:
无
*前置条件:
顺序表不存在
*功能:
构建一个顺序表
*输出:
*后置条件:
表长为0
*/
实现代码:
template<
SeqList<
datatype>
SeqList()
length=0;
(3)顺序表的建立算法(带参数的构造函数)严
顺序表信息的数组形式a[],顺序表长度n
将数组a[]中元素建为长度为n的顺序表
SeqList(datatvpea[],mtn)
if(n>
MaxSize)
cout«
-数组元素个数不合法-«
endl;
for(mti=0;
data[i]=a[i];
length=n;
}(4)在顺序表的第i个位置前插入元素e算法严
插入元素e,插入位置1
顺序表存在,I要合法
将元素e插入到顺序表中位置1处
顺序表插入新元素,表长加1
voidSeqList<
:
Iiisen(inti,datatypeitem)
mtj;
if(length>
=MaxSize)
M溢出H«
l|i>
length+l)
Mi不合法!
”<
<
for(j=length;
j>
=i;
j-)
data[j]=data[j-l];
data[i-l]=item;
length++;
}(5)删除线性表中第i个元素算法
严
要删除元素位置1
顺序表存在」要合法
删除顺序表中位置为1的元素
顺序表册除了一个元素,表长减1
datatypeSeqList<
datatvpe>
Delete(inti)
intitemj;
if(length=0)cout«
M表为空,无法删除元素!
H«
length)
{cout«
Mi不合法!
}item=data[i-1];
//获得要删除的兀素值for(j=i;
length;
j++)data[j-l]=data[j];
〃注意数组下标从0记
length--;
returnitem;
}(6)遍历线性表元素算法
顺序表存在
顺序表遍历
输出所有元素
template<
classdatatvpe>
voidSeqList<
displayQ
if(length==O)
M表为空,无法输出!
}fbr(inti=O;
i<
i-H-)
data[i]«
M”;
(7)获得线性表长度算法
输出顺序表长度
出:
顺序轰长度
mtSeqList<
LengtliQ
returnLength;
(8)在顺序线性表中查找e值,返回该元素的位序算法/*
查询元素值e
按值查找值的元素并输出位置
查询元素的位置
mtSeqList<
Locate(datatypeitem)
i++)if(data[i]==item)returni+1;
〃下标为i的元素等于item,返回其序号讦1return0;
〃查找失败
(9)获得顺序线性表第1个元素的值严
查询元素位置1
按位查找位置为1的元素并输出值
查询元素的值
Get(iiiti)
{’
0||i>
lengtli)
elsereturndata[i-l];
(10)判表空算法
判表是否为空
为空返回1,不为空返回0
boolSeqList<
EmptyQ
if(length=0)
return1;
return0;
(11)求直接前驱结点算法
要查找的元素"
待存放前驱结点值7
*功八能;
查找该元素的所在位置,获得其前驱所在位置。
返回其前驱结点的位序。
7值为前驱结点的值
Pre(datatvpeitem)
intk=Locate(item)-l;
if(k>
0)
returnk;
M无前驱结点!
y<
eiidl;
return0;
(12)求直接后继结点算法
待存放后继结点值7
查找该元素的所在位置,获得其后继所在位置。
水输出:
返回其后继结点的位序。
7值为后继结点的值
Suc(datatypeitem)
intk=Locate(item)+l;
if(k>
M无后继结点!
上机实现以上基本操作,写出main()程序:
用以上基本操作算法,实现A二AUB算法。
(利用函数模板实现)严
集合A,集合E
实现A=AUB
A中添加了E中的元素。
实现代码:
SeqList<
Add(SeqList<
item)
if(item.EmptyO)
return*tliis;
mtk=item.Length();
mtnum=this->
Lengtli();