数据结构严蔚敏上机代码完整.docx
《数据结构严蔚敏上机代码完整.docx》由会员分享,可在线阅读,更多相关《数据结构严蔚敏上机代码完整.docx(20页珍藏版)》请在冰豆网上搜索。
数据结构严蔚敏上机代码完整
数据结构(严蔚敏)上机代码完整版
————————————————————————————————作者:
————————————————————————————————日期:
数据结构
第一、二次上机:
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#definelist_init_size100//线性表存储空间的初始分配量
#defineLISTINCREMENT10//线性表存储空间的分配增量
typedefintStatus;
typedefintElemType;
typedefstruct{
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
StatusInitList_Sq(SqList&L){
//构造一个空的线性表L
L.elem=(ElemType*)malloc(list_init_size*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);//存储分配失败
L.length=0;//空表长度为0
L.listsize=list_init_size;//初始存储容量
returnOK;
}//Initlist_Sq
StatusListInsert_Sq(SqList&L,inti,ElemTypee){
//在顺序线性表L中第i个位置之前插入新的元素e,
//i的合法值为1<=i<=ListLength_Sq(L)+1
ElemType*p,*q,*newbase;//定义指针
if(i<1||i>L.length+1)
returnERROR;//i值不合法
if(L.length>=L.listsize){//当前存储空间已满,增加分配
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)exit(OVERFLOW);//存储分配失败
L.elem=newbase;//新基址
L.listsize+=LISTINCREMENT;//增加存储容量
}
q=&(L.elem[i-1]);//q为插入位置
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;//插入位置及之后的元素右移
*q=e;//插入e
++L.length;//表长增1
returnOK;
}//ListInsert_Sq
StatusListDelete_Sq(SqList&L,inti,ElemType&e){
//在顺序线性表L中删除第i个元素,并用e返回其值
//i的合法值为1<=i<=ListLength_Sq(L)
ElemType*p,*q;//定义指针
if((i<1)||(i>L.length))
returnERROR;//i值不合法
p=&(L.elem[i-1]);//p为被删除元素的位置
e=*p;//被删除元素的值赋给e
q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p)
*(p-1)=*p;//被删除元素之后的元素左移
--L.length;//表长减1
returnOK;
}//ListDelete_sq
voiddisplay(SqListL)
{//定义for循环函数
inti;
for(i=0;i<=L.length-1;i++)
printf("%d\n",L.elem[i]);
}
intLocateElem_Sq(SqListL,ElemTypee)
{
//在顺序线性表L中查找第1个值与e满足compare()的元素的位序
//若找到,则返回其在L中的位序,否则返回0
ElemType*p;
inti=1;//i的初值为第一个元素的位序
p=L.elem;//p的初值为第一个元素的存储位置
while(i<=L.length&&*p++!
=e)++i;
if(i<=L.length)returni;
elsereturn0;
}//LocateElem_Sq
voidMergeList_Sq(SqListLa,SqListLb,SqList&Lc){
//已知顺序线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的顺序线性表Lc,Lc的元素也按非递减排列
ElemType*pa,*pb,*pc,*pa_last,*pb_last;
pa=La.elem;
pb=Lb.elem;
Lc.listsize=Lc.length=La.length+Lb.length;
pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));
if(!
Lc.elem)exit(OVERFLOW);//存储分配失败
pa_last=La.elem+La.length-1;
pb_last=Lb.elem+Lb.length-1;
while(pa<=pa_last&&pb<=pb_last)
{
//归并
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last)*pc++=*pa++;//插入La的剩余元素
while(pb<=pb_last)*pc++=*pb++;//插入Lb的剩余元素
}//MergeList_Sq
voidmain()
{
/*
SqListL;//定义线性表
InitList_Sq(L);//调用空表
//插入数据
ListInsert_Sq(L,1,10);
ListInsert_Sq(L,2,20);
ListInsert_Sq(L,1,30);
ListInsert_Sq(L,3,40);
printf("插入后:
\n");
display(L);//调用循环函数
ListInsert_Sq(L,3,100);//在L表第三个位置插入100
printf("插入后:
\n");
display(L);
ElemTypee;//定义e
ListDelete_Sq(L,3,e);//删除L表的第三个元素,用e表示
printf("删除后:
\n");
display(L);
printf("被删除元素:
%d\n\n\n\n",e);
*/
SqListLa,Lb,Lc;
InitList_Sq(La);
ListInsert_Sq(La,1,3);
ListInsert_Sq(La,2,5);
ListInsert_Sq(La,3,8);
ListInsert_Sq(La,4,11);
printf("La插入后:
\n");
display(La);
InitList_Sq(Lb);
ListInsert_Sq(Lb,1,2);
ListInsert_Sq(Lb,2,6);
ListInsert_Sq(Lb,3,8);
ListInsert_Sq(Lb,4,9);
ListInsert_Sq(Lb,5,11);
ListInsert_Sq(Lb,6,15);
ListInsert_Sq(Lb,7,20);
printf("Lb插入后:
\n");
display(Lb);
MergeList_Sq(La,Lb,Lc);
printf("归并后:
\n");
display(Lc);
printf("\n");
inta=LocateElem_Sq(Lc,5);
printf("%d\n",a);
}
第三次上机:
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
typedefintElemType;
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LNOde,*LinkList;
StatusGetElem_L(LinkListL,inti,ElemType&e)
{
//L为带头结点的单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LinkListp;
p=L->next;
intj=1;//初始化,p指向第一个结点,j为计数器
while(p&&j
{
//顺指针向后查找,直到p指向第i个元素或p为空
p=p->next;
++j;
}
if(!
p||j>i)
returnERROR;//第i个元素不存在
e=p->data;//取第i个元素
returnOK;
}//GetElem_L
StatusListInsert_L(LinkList&L,inti,ElemTypee)
{
//在带头结点的单链线性表L中第i个位置之前插入元素e
LinkListp,s;
p=L;
intj=0;
while(p&&j{
p=p->next;
++j;
}//寻找第i-1个结点
if(!
p||j>i-1)returnERROR;//i小于或者大于表长+1
s=(LinkList)malloc(sizeof(LNode));//生成新结点
s->data=e;
s->next=p->next;//插入L中
p->next=s;
returnOK;
}//ListInsert_L
StatusListDelete_L(LinkList&L,inti,ElemType&e)
{
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
LinkListp,q;
p=L;
intj=0;
while(p->next&&j{
//寻找第i个结点,并令p指向其前趋
p=p->next;++j;
}
if(!
(p->next)||j>i-1)returnERROR;//