北京交通大学数据结构上机实验1Word文档下载推荐.docx
《北京交通大学数据结构上机实验1Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《北京交通大学数据结构上机实验1Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
#defineERROR0
#defineOK1
typedefintstatus;
typedefintelemtype;
typedefstructLNode
{
elemtypedata;
structLNode*next;
}LNode,*LinkList;
CreatList_L(LinkList&
L,intn)
LinkListp,q;
inti=0;
L=(LinkList)malloc(sizeof(LNode));
if(!
L)exit(0);
q=(LinkList)malloc(sizeof(LNode));
q)exit(0);
L->
next=q;
printf("
请输入一个元素:
\n"
);
scanf("
%d"
&
q->
data);
p=q;
while(q->
data!
=-1)
{
q=(LinkList)malloc(sizeof(LNode));
if(!
请输入另一个元素:
p->
i++;
}
next=NULL;
链表长度为:
%d\n"
i);
returnOK;
}
voidprint(LinkList&
L)
LinkListp=L->
next;
while(p!
=NULL&
&
data!
=-1)
printf("
%3d"
p->
p=p->
statusListInsert_L(LinkList&
L,inti,elemtype&
e)
intj=0;
LinkListp,q;
p=L;
while(p&
j<
i-1)
p=p->
j++;
q=(LinkList)malloc(sizeof(LNode));
data=e;
next=p->
p->
return1;
statusListDelet_L(LinkList&
i)
q=p;
e=p->
data;
next=q->
next->
free(p);
returne;
statusGetElem_L(LinkListL,inti,elemtype&
LinkListp;
intj;
p=L->
j=1;
(j<
i)){
p=p->
if(!
p||j>
returnERROR;
returnOK;
statusListReverse(LinkList&
LinkListt,p,q;
t=L->
p=t->
t->
=NULL)
q=p->
next=t;
t=p;
L=t;
voidMostList(LinkListL){
LinkListp;
inti,j;
p=L->
i=j=p->
while(p){
if(i<
data)i=p->
if(j>
data)j=p->
p=p->
最大值为:
%d\n"
最小值为:
j);
voidmain()
LinkListL;
intn,e,k,m,i;
CreatList_L(L,n);
print(L);
printf("
逆置后的单链表为:
ListReverse(L);
请输入要插入的数据:
scanf("
&
e);
请输入要插入元素的位置:
n);
ListInsert_L(L,n,e);
请输入要删除的数据的位置:
被删除的元素是:
k=ListDelet_L(L,n,k);
k);
删除后的单链表为:
请输入所要显示的元素的位置:
i);
所取出的元素是:
GetElem_L(L,i,m);
m);
MostList(L);
}四)链表的合并(1分)
(1)创建两个链表LA,LB(各链表按升序排列),分别显示两链表;
(2)将两个链表合并成一个新的有序表(升序排列),显示链表.
typedefchardatatype;
typedefstructnode
datatypedata;
structnode*next;
}listnode;
typedeflistnode*linklist;
linklistcreatlist();
voidprintlist(linklist);
linklistlistadd(linklist,linklist);
linklistla=creatlist();
linklistlb=creatlist();
//printlist(la);
//printlist(lb);
linklistlc=listadd(la,lb);
合并后的单链表为:
printlist(lc);
linklistcreatlist()//创建单链表
charch;
linklisthead=(linklist)malloc(sizeof(listnode));
linklistp,q;
q=head;
while((ch=getchar())!
='
\n'
)
p=(linklist)malloc(sizeof(listnode));
data=ch;
q->
next=p;
returnhead;
voidprintlist(linklisthead)//输出单链表
linklistp;
for(p=head->
p;
next)
%c"
linklistlistadd(linklistla,linklistlb)//两链表合并
linklistpb,pa,p,q;
for(pa=la->
next,pb=lb->
pa&
pb;
if(pa->
data>
pb->
data)
data=pb->
pb=pb->
elseif(pa->
data<
data=pa->
pa=pa->
else
if(pa==NULL&
pb!
while(pb!
if(pa!
=NULL&
pb==NULL)
while(pa!
五)单循环链表(2分)
(1)建两个带头结点的循环单链表LA,LB单循环链表,
(2)将两个循环单链表合并为一个循环单链表,其头指针为LA。
typedefstructLnode{
intdata;
structLnode*next;
}LNode,*LinkList;
LinkListCreatList_L(void){
LinkListhead;
LinkListp1,p2;
head=p1=p2=(LinkList)malloc(sizeof(LNode));
d"
p1->
head->
next=p1;
while(p1->
=-1){
p2->
p2=p1;
p1=(LinkList)malloc(sizeof(LNode));
next=head;
LinkListMergeList(LinkListLA,LinkListLB){
LinkListp,q,m,n;
n=LA;
p=LA->
q=m=LB->
while(p->
next!
=LA)
while(q->
=LB)
q=q->
next=m;
returnn;
voidShowList(LinkListL){
链表为:
=L){
LinkListLA,LB,LC;
请输入循环链表A的元素:
"
LA=CreatList_L();
ShowList(LA);
请输入循环链表B的元素:
LB=CreatList_L();
ShowList(LB);
LC=MergeList(LA,LB);
合并后"
ShowList(LC);
}六)单链表应用(2分)
建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位,并在此链表上实现对二进制数加1的运算。
#include<
conio.h>
/*链表结点*/
typedefstruct_Node
struct_Node*next;
/*指向下一个结点*/
unsignedcharbit;
/*当前结点所代表的二进制位*/
}Node;
/*在链表的结尾添加一个结点*/
voidaddNode(Node*prior,unsignedcharbit)
Node*node=(Node*)malloc(sizeof(Node));
node->
next=NULL;
bit=bit;
prior->
next=node;
voidinsToHead(Node*head,unsignedcharbit)
next=head->
Node*createList(void)
intbit;
Node*head=(Node*)malloc(sizeof(Node));
while((bit=getch())!
=26)
if(bit=='
1'
||bit=='
0'
bit=bit-'
;
bit);
insToHead(head,bit);
/*低端二进制位放在链表的前面*/
voidinc(Node*head)
Node*node;
unsignedcharadd;
/*头结点并不算在二进制数中,所以它的二进制位是无效的*/
/*如果只有头结点,加1则生成一个结点*/
/*这就是说生成一个值为1的二进制数链表*/
if(head->
next==NULL)
addNode(head,1);
return;
add=1;
node=head;
/*add表示要在当前结点的后续结点的二进制值上加1*/
while(add)
/*如果当前结点的后续结点不存在,则增加一个结点在结尾,且其值为1*/
if(node->
addNode(node,1);
/*如果当前结点的后续结点存在,则直接把其值加1*/
node=node->
/*如果后续结点的值本来为1,重设其值为0,且需要进位*/
bit==1)
bit=0;
/*如果后续结点的值本来为0,重设其值为1,且不必进位,结束算法*/
bit=1;
add=0;
/*删除链表,传入头结点*/
voiddelList(Node*node)
if(node==NULL)
next!
=NULL)
delList(node->
next);
free(node);
/*加法操作方便了,打印就比较麻烦,用递归来做。
*/
/*注意传进来的参数是头结点的后续结点哦!
voidprint(Node*node)
Emptylist!
print(node->
%1d"
node->
bit);
intmain(void)
/*生成链表头结点*/
Node*head;
Pleaseinputthebinary:
head=createList();
inc(head);
print(head->
/*打印链表*/
delList(head);
return0;