线性表的基本操作讲解.docx
- 文档编号:5837594
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:21
- 大小:20.79KB
线性表的基本操作讲解.docx
《线性表的基本操作讲解.docx》由会员分享,可在线阅读,更多相关《线性表的基本操作讲解.docx(21页珍藏版)》请在冰豆网上搜索。
线性表的基本操作讲解
线性表的基本操作
一、实验目的
1.掌握用C++/C语言调试程序的基本方法。
2.掌握线性表的顺序存储和链式存储的基本运算,如插入、删除等。
二、实验要求
1.C++/C完成算法设计和程序设计并上机调试通过。
2.撰写实验报告,提供实验结果和数据。
3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。
三、实验内容:
1.分析并运行以卞各子程序的主要功能。
程序1:
顺序存储的线性表和运算
#include〈stdio.h>
#defineMAXSIZE100
intlist[MAXSIZE];
intn;
/♦insertinaseqlist*/
intsq_insert(intlist[],int*p_n,inti,intx)
{intj;
if(i<0i>*p_n)return
(1);
if(*p_n==MAXSIZE)return
(2);
for(j=*p_n+l;j>i;j—)
list[j]=list[j-l];
list[i]二x;
(*p_n)++;
return(0);
}
/♦deleteinaseqlist*/
intsq_delete(intlist[],int*p_n,inti)
{intj;
if(i<0i>=*p_n)return
(1);
for(j=i+1;j<=*p_n;j++)
二listEjl;
(*p_n)--;
return(0);
}
voidmainO
{inti,x,temp;
printf("pleaseinputthenumberforn\n");
printf(〃n「);
scanf(,z%d,\&n);
for(i二0;i<=n;i++)
{printf("list[%d]二",i);
scanf(”%d",&list[i]);}
printf(z,Thelistbeforeinsertionis\n");
for(i二0;i<=n;i++)printf(z,%dz,,list[i]);
printf("\n");
printf("pleaseinputthepositionwhereyouwanttoinsertavalue\nposition=〃);scanf(,z%d,z,&i);
printf("pleaseinputthevalueyouwanttoinsert・\nx=z,);
scanf(,z%d,z,&x);
temp=sq_insert(list,&n,i,x);
switch(twmp)
{case0:
printfC'Theinsertionissuccessful!
\n");
printf("Thelistisafterinsertionis\n");
for(i=0;i<=n;i++)printf("%d"Jist[i]);
printf("\n");
printf(“%d\n",n);
break;
case1:
case2:
printf("Theinsertionisnotsuccessful!
\n,z);break;}
/*deleting*/
printf("Thelistbeforedeletingis\n");
for(i二0;i<=n;i++)printf(z,%dz,,list[i]);
printf("\n");
printf("pleaseinputthepositionwhereyouwanttodeleteavalue\nposition=〃);scanf(,z%d,z,&i);
temp=sq_delete(list,&n,i);
switch(twmp)
{case0:
printfC'Thedeletingissuccessful!
\nz/);
printf("Thelistisafterdeletingis\n");
for(i=0;i<=n;i++)printf("%d"Jist[i]);
printf("\n");
printf(“%d",n);
break;
case1:
printf("Thedeletingisnotsuccessful!
,z);break;}
}
2.分析并运行以下各子程序的主要功能。
程序2链式存储的线性表和运算
#include〈stdio.h>
#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;
printf("Pleaseinput%dcharsforthelinklist\n",n);
for(i二0;i {scanf(,z%c"、&(p~>data)); q=(NODE*)malloc(sizeof(NODE)): printf("test3\n");p~>next二q; P二q;} scanf(,z%c"、&(p->data)); 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; q~>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; q~>next=p->next; p->next二q;} } /♦Thefunctiondeletesthenodewhosevalueisa,♦/ /*ifsuccess,return0,orreturn1*/ intdeletenode(N0DE**p_head,chara) {NODE*p,*q; q=*p_head; if(q==NULL)return (1); if(q">data==a) {*p_head=q~>next; free(q); return(0);} else {whi.le(q~>data! =a&&q~>next! =NULL) {p=q; q=q">next;} if(q->data==a) {p->next二q->next; free(q); return(0);} elsereturn(l);} } voidmainO {NODE*my_head,*p: /*createalinklistwithmnodes*/ intm; charch_a,ch_b; printf("pleaseinputthenumberofnodesforthelink_list\nm二");scanf; getchar0; printf(/ztestl\n"); my_head=(NODE*)malloc(sizeof(NODE));my_head=create_link_list(m); /♦Outputthelinklist♦/ printf(〃Thelinklistislike: \nz,); p=my_head; while(p! =NULL) {printf("$c"、p~>data); p=p~>next; } printf("\n"); /♦insertanodewhosevalueisbbeforea*/ printf("Pleaseinputthepositionfora\nch_a="); getchar0; scanf(,z%c,z,&ch_a); getchar0; printf("Pleaseinputthevaluethatyouwanttoinsert\nch_b=");scanf(,z%c,z,&ch_b); getchar0; insert(&my_head,ch_a,ch_b); printf(〃Thelinklistafterinsertionislike: \nz,);p=my_head; while(p! =NULL) {printf("$c"、p*>data); p=p~>next; } printf("\n"); /♦deleteanodewhosevalueisa*/ printf("Pleaseinputthepositionforaa="); scanf(,z%c,z,&ch_a); getchar0; deletenode(&my_head,ch_a); printf(〃Thelinklistafterdeletingislike: \n,z);p=my_head; while(p! =NULL) {printf("$c"、p~>data); p=p~>next; } printf(〃\n"); } 3.运行以下程序并分析各子函数的主要功能。 ^include ^include stmcttagNode { intdata; stmcttagNode*pNext; }; tvpedefstmcttagNode*pNode; 〃将结点插入到链表的适当位置,这是一个降序排列的链表// voiduisertList(pNodehead,//链表头结点 pNodepnode)//要插入的结点 { pNodepPri=head; while(pPri->pNext! =NULL) { if(pPri->pNext->data { pnode->pNext=pPri->pNext;pPri->pNext=pnode; break; } pPri=pPri->pNext; } if(pPri->pNext==NULL)//如果要插入的结点最小 { pPri->pNext=pnode; } } 〃输出链表 voidprmtLuikedList(pNodehead) { pNodetenip=head->pNext; while(temp? =NULL) { prmtf(n%dM,temp->data); temp=temp->pNext; } } 〃从链表中删除结点 voiddelfoiniList(pNodehead,mtdata) pNodetenip=head->pNext; pNodepPri=head;while(temp! =NULL) if(temp->data==data) pPri->pNext=temp->pNext;fiee(temp); break; } pPri=temp; temp=temp・>pNext; pNodehead=(pNode)malloc(sizeof(stnicttagNode));//给头指l|•分配空间pNodepTemp=NULL; inttemp; head->pNext=NULL;//比较好的习惯就是分配好空间,马上赋值 prmtf("请输入要放入链表中的数据,以-1结尾: ”); 〃读入数据,以-1结尾,把数据插入链表中scanf(H%cl,\&temp); while(temp? =-l) pTemp=(pNode)nialloc(sizeof(sti-ucttagNode));pTemp pTemp->pNext=NULL; msertList(head,pTemp); scanf(”%cT: &2mp); } pnntf(”降序排列的链表为: \n“); printLiiikedList(head); 〃下面的代码当删除函数编写成功后,可以取消注释,让其执行,主要是调用函数实现链表结点的删除 〃pnntf(”请输入要删除数,以-1结尾: ”); //scanf(n%d,\&temp); //wlule(temp! =-l) 〃{ delfbrniList(head.temp); //scaiif(M%d,\&temp); 〃} 〃pnntf(”删除节点后,链表中剩余数据为: ”); //printLuikedList(head); //pnntW); } ! 1! 、思考与提高 试将以上链表改为有序表,并分析有序表有哪些显著的优点和缺点? 库函数载和常量定义: (代码,C++) #iiiclude usingnamespacestd; constmtMaxSize=100; (1)顺序表存储结构的定义(类的产明上、代码)template 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 : SeqList() { length=0; } (3)顺序表的建立算法(带参数的构造函数)严 *输入: 顺序表信息的数组形式a[],顺序表长度n *前置条件: 顺序表不存在 *功能: 将数组a[]中元素建为长度为n的顺序表 *输出: 无 *后置条件: 构建一个顺序表 */ 实现代码: template SeqList : SeqList(datatvpea[],mtn) { if(n>MaxSize) { cout«-数组元素个数不合法-«endl; } for(mti=0;i data[i]=a[i]; length=n; }(4)在顺序表的第i个位置前插入元素e算法严 *输入: 插入元素e,插入位置1 *前置条件: 顺序表存在,I要合法 *功能: 将元素e插入到顺序表中位置1处 *输出: 无 *后置条件: 顺序表插入新元素,表长加1 */ 实现代码: template voidSeqList : Iiisen(inti,datatypeitem) { mtj; if(length>=MaxSize) { cout«M溢出H«endl; } if(i { cout«Mi不合法! ”< } for(j=length;j>=i;j-) data[j]=data[j-l]; data[i-l]=item; length++; }(5)删除线性表中第i个元素算法 严 *输入: 要删除元素位置1 *前置条件: 顺序表存在」要合法 *功能: 删除顺序表中位置为1的元素 *输出: 无 *后置条件: 顺序表册除了一个元素,表长减1 */ 实现代码: template datatypeSeqList : Delete(inti) intitemj;if(length=0)cout«M表为空,无法删除元素! H«endl; } if(i {cout«Mi不合法! H«endl; }item=data[i-1];//获得要删除的兀素值for(j=i;j length--; returnitem; }(6)遍历线性表元素算法 严 *输入: 无 *前置条件: 顺序表存在 *功能: 顺序表遍历 *输出: 输出所有元素 *后置条件: 无 */ 实现代码: template : displayQ { if(length==O) {cout«M表为空,无法输出! H«endl; }fbr(inti=O;i {cout«data[i]«M”; } } (7)获得线性表长度算法 严 *输入: 无 *前置条件: 顺序表存在 *功能: 输出顺序表长度 出: 顺序轰长度 *后置条件: 无 */ 实现代码: template : LengtliQ { returnLength; } (8)在顺序线性表中查找e值,返回该元素的位序算法/* *输入: 查询元素值e *前置条件: 顺序表存在 *功能: 按值查找值的元素并输出位置 *输出: 查询元素的位置 *后置条件: 无 */ 实现代码: template mtSeqList : Locate(datatypeitem) { for(mti=0;i 〃下标为i的元素等于item,返回其序号讦1return0;〃查找失败 } (9)获得顺序线性表第1个元素的值严 *输入: 查询元素位置1 *前置条件: 顺序表存在,I要合法 *功能: 按位查找位置为1的元素并输出值 *输出: 查询元素的值 *后置条件: 无 */ 实现代码: template datatypeSeqList : Get(iiiti) {’ if(i<0||i>lengtli) { cout«Mi不合法! H«endl; } elsereturndata[i-l]; } (10)判表空算法 严 *输入: 无 *前置条件: 无 *功能: 判表是否为空 *输出: 为空返回1,不为空返回0 *后置条件: 无 */ 实现代码: template boolSeqList : EmptyQ { if(length=0) { return1; } else { return0; } (11)求直接前驱结点算法 *输入: 要查找的元素"待存放前驱结点值7 *前置条件: 无 *功八能;查找该元素的所在位置,获得其前驱所在位置。 *输出: 返回其前驱结点的位序。 *后置条件: 7值为前驱结点的值 */ 实现代码: template mtSeqList : Pre(datatvpeitem) { intk=Locate(item)-l; if(k>0) returnk; else cout«M无前驱结点! y } } (12)求直接后继结点算法 严 *输入: 要查找的元素"待存放后继结点值7 *前置条件: 无 *功八能;查找该元素的所在位置,获得其后继所在位置。 水输出: 返回其后继结点的位序。 *后置条件: 7值为后继结点的值 */ 实现代码: template mtSeqList : Suc(datatypeitem) { intk=Locate(item)+l; if(k>lengtli) { cout«M无后继结点! H«endl; return0; } else returnk; } } 上机实现以上基本操作,写出main()程序: 用以上基本操作算法,实现A二AUB算法。 (利用函数模板实现)严 *输入: 集合A,集合E *前置条件: 无 *功能: 实现A=AUB *输出: 无 *后置条件: A中添加了E中的元素。 */ 实现代码: template SeqList : Add(SeqList if(item.EmptyO) return*tliis; else { mtk=item.Length(); mtnum=this->Lengtli();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性 基本 操作 讲解