数据结构实验课代码.docx
《数据结构实验课代码.docx》由会员分享,可在线阅读,更多相关《数据结构实验课代码.docx(68页珍藏版)》请在冰豆网上搜索。
数据结构实验课代码
//单链表
#include
usingnamespacestd;
#include
classListNode//结点类
{
public:
ListNode*next;
intdata;
ListNode(ListNode*pnext=NULL)
{
next=pnext;
}
ListNode(intitem,ListNode*pnext=NULL)
{
data=item;
next=pnext;
}
~ListNode()
{
}
};
classLinkList//链表类
{
private:
ListNode*head;
intsize;
ListNode*index(inti);
public:
LinkList();
~LinkList();
intlist_size();
intlist_insert(inti,intitem);
intlist_del(inti);
intlist_get(inti);
};
LinkList:
:
LinkList()
{
head=newListNode();
size=0;
}
LinkList:
:
~LinkList()
{
ListNode*p,*q;
p=head;
while(p!
=NULL)
{
q=p;
p=p->next;
deleteq;
}
size=0;
head=NULL;
}
ListNode*LinkList:
:
index(inti)
{
if(i<-1||i>size-1)
{
exit(-1);
}
if(i==-1)
{
returnhead;
}
ListNode*p=head->next;
intj=0;
while(p!
=NULL&&j
{
p=p->next;
j++;
}
returnp;
}
intLinkList:
:
list_size()
{
returnsize;
}
intLinkList:
:
list_insert(inti,intitem)
{
if(i<0||i>size)
{
exit(-1);
}
ListNode*p=index(i-1);
ListNode*q=newListNode(item,p->next);
p->next=q;
size++;
return1;
}
intLinkList:
:
list_del(inti)
{
if(size==0)
{
exit(-1);
}
if(i<0||i>size-1)
{
exit(-1);
}
ListNode*s,*p=index(i-1);
s=p->next;
p->next=p->next->next;
inttemp=s->data;
deletes;
size--;
returntemp;
}
intLinkList:
:
list_get(inti)
{
if(i<0||i>size-1)
{
exit(-1);
}
ListNode*p=index(i);
returnp->data;
}
intmain()
{
inti,temp,len,item,inspos,delpos,getpos;
LinkListmy;
cout<<"输入创建链表的长度:
";
cin>>len;
cout<<"输入各数据:
";
for(i=0;i{
cin>>temp;
my.list_insert(i,temp);
}
for(i=0;i{
cout<}
cout<cout<<"输入查找位置:
";
cin>>getpos;
cout<<"查找到的数据为:
"<cout<cout<<"输入插入新结点的位置和数据:
";
cin>>inspos>>item;
my.list_insert(inspos-1,item);//插入新数据
cout<<"新链表为:
";
for(i=0;i{
cout<}
cout<cout<<"输入删除结点的位置:
";
cin>>delpos;
my.list_del(delpos-1);
cout<<"新链表为:
";
for(i=0;i{
cout<}
cout<return1;
}
//KMP串
#include
usingnamespacestd;
#include
classString
{
private:
char*str;
intsize;
intmaxSize;
voidGetNext(constString&t,intnext[])const;
intKMPFind(constString&t,intstart,intnext[])const;
public:
String(char*s="");
~String(void);
intKMPFindSubstr(constString&t,intstart)const;
};
String:
:
String(char*s)
{
size=strlen(s);
maxSize=size+1;
str=newchar[maxSize];
strcpy(str,s);
}
String:
:
~String(void)
{
delete[]str;
}
voidString:
:
GetNext(constString&t,intnext[])const
{
ints=t.size;
intj=1,k=0,i;
next[0]=-1;
next[1]=0;
while(j<(t.size-1))
{
if(t.str[j]==t.str[k])
{
next[j+1]=k+1;
j++;
k++;
}
elseif(k==0)
{
next[j+1]=0;
j++;
}
else
k=next[k];
}
for(i=0;i
{
cout<}
cout<}
intString:
:
KMPFindSubstr(constString&t,intstart)const
{
intm=t.size;
int*next=newint[m];
GetNext(t,next);
intv=KMPFind(t,start,next);
delete[]next;
returnv;
}
intString:
:
KMPFind(constString&t,intstart,intnext[])const
{
intv,i=start,j=0;
while((i{
if((j==-1)||(str[i]==t.str[j]))
{
i++;
j++;
}
else
j=next[j];
}
if(j==t.size)
v=i-t.size;
else
v=-1;
returnv;
}
intmain()
{
inttestNo,m;
intindex;
charstr1[80],str2[80];
cin>>testNo;
cin.get();
for(m=0;m{
cin.getline(str1,80);
cin.getline(str2,80);
Strings1(str1),s2(str2);
index=s1.KMPFindSubstr(s2,0)+1;
cout<}
return1;
}
//平衡二叉树平衡因子
#include
#include
#include
usingnamespacestd;
intj;
/*
该程序用一维数组来构造一个二叉树,求平衡因子
*/
intDepth(char*c,intn)
{
if(c[n]!
='0')
{
inthl=Depth(c,2*n);
inthr=Depth(c,2*n+1);
returnhl>hr?
hl+1:
hr+1;
}
elsereturn0;
}
//递归求二叉树每个结点的平衡因子
intBalance(char*c,intn)
{
inthl=Depth(c,2*n);
inthr=Depth(c,2*n+1);
returnhl-hr;
}
voidpro(char*c,intn)
{
if(c[n]!
='0')
{
pro(c,2*n);
pro(c,2*n+1);
cout<}
}
intmain()
{
intx,i=1;
chara[100];
for(i=0;i<100;i++)
a[i]='0';
cin>>x;
for(i=1;icin>>a[i];
pro(a,1);
return0;
}
//希尔排序
#include
usingnamespacestd;
//希尔排序
voidShellInsert(int*a,intlen,intdk){
inti,j;
for(i=dk+1;i<=len;i++){
if(a[i]a[0]=a[i];
f