数据结构例题123Word文件下载.docx
- 文档编号:20484667
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:64
- 大小:32.80KB
数据结构例题123Word文件下载.docx
《数据结构例题123Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构例题123Word文件下载.docx(64页珍藏版)》请在冰豆网上搜索。
B,j,i*2)==0)
printf("
顺序表A中的元素:
\n"
=A.length;
i++)/*输出顺序表A中的每个元素*/
flag=GetElem(A,i,&
e);
/*返回顺序表A中的每个元素到e中*/
if(flag==1)
%4d"
e);
顺序表B中的元素:
=B.length;
i++)/*输出顺序表B中的每个元素*/
flag=GetElem(B,i,&
/*返回顺序表B中的每个元素到e中*/
将在A中出现B的元素删除后A中的元素:
DelElem(&
A,B);
/*将在顺序表A中出现的B的元素删除*/
i++)/*显示输出删除后A中所有元素*/
}
voidDelElem(SeqList*A,SeqListB)
/*删除A中出现B的元素的函数实现*/
inti,flag,pos;
for(i=0;
i++)
/*依次把B中每个元素取出给e*/
pos=LocateElem(*A,e);
/*在A中查找和B中取出的元素e相等的元素*/
if(pos>
0)
DeleteList(A,pos,&
/*如果找到该元素,将其从A中删除*/
重点1:
#defineListSize100
typedefintDataType;
typedefstruct
DataTypelist[ListSize];
intlength;
}SeqList;
voidInitList(SeqList*L)
/*将线性表初始化为空的线性表只需要把线性表的长度length置为0*/
L->
length=0;
/*把线性表的长度置为0*/
intListEmpty(SeqListL)
/*判断线性表是否为空,线性表为空返回1,否则返回0*/
if(L.length==0)/*判断线性表的长度是否为9*/
return1;
/*当线性表为空时,返回1;
否则返回0*/
else
return0;
intGetElem(SeqListL,inti,DataType*e)
/*查找线性表中第i个元素。
查找成功将该值返回给e,并返回1表示成功;
否则返回-1表示失败。
*/
if(i<
1||i>
L.length)/*在查找第i个元素之前,判断该序号是否合法*/
return-1;
*e=L.list[i-1];
/*将第i个元素的值赋值给e*/
intLocateElem(SeqListL,DataTypee)
/*查找线性表中元素值为e的元素,查找成功将对应元素的序号返回,否则返回0表示失败。
inti;
L.length;
i++)/*从第一个元素开始比较*/
if(L.list[i]==e)
returni+1;
return0;
intInsertList(SeqList*L,inti,DataTypee)
/*在顺序表的第i个位置插入元素e,插入成功返回1,如果插入位置不合法返回-1,顺序表满返回0*/
intj;
L->
length+1)/*在插入元素前,判断插入位置是否合法*/
插入位置i不合法!
elseif(L->
length>
=ListSize)/*在插入元素前,判断顺序表是否已经满,不能插入元素*/
printf("
顺序表已满,不能插入元素。
for(j=L->
length;
j>
=i;
j--)/*将第i个位置以后的元素依次后移*/
L->
list[j]=L->
list[j-1];
list[i-1]=e;
/*插入元素到第i个位置*/
length=L->
length+1;
/*将顺序表长增1*/
return1;
intDeleteList(SeqList*L,inti,DataType*e)
if(L->
length<
=0)
顺序表已空不能进行删除!
elseif(i<
length)
删除位置不合适!
*e=L->
list[i-1];
for(j=i;
=L->
length-1;
j++)
list[j-1]=L->
list[j];
intListLength(SeqListL)
returnL.length;
voidClearList(SeqList*L)
例二:
voidMergeList(SeqListA,SeqListB,SeqList*C);
/*合并顺序表A和B中元素的函数声明*/
inti,flag;
DataTypea[]={6,11,11,23};
DataTypeb[]={2,10,12,12,21};
SeqListA,B,C;
/*声明顺序表A,B和C*/
C);
/*初始化顺序表C*/
=sizeof(a)/sizeof(a[0]);
i++)/*将数组a中的元素插入到顺序表A中*/
A,i,a[i-1])==0)
=sizeof(b)/sizeof(b[0]);
i++)/*将数组b中元素插入到顺序表B中*/
B,i,b[i-1])==0)
i++)/*输出顺序表A中的每个元素*/
/*返回顺序表A中的每个元素到e中*/
i++)/*输出顺序表B中的每个元素*/
/*返回顺序表B中的每个元素到e中*/
将在A中出现B的元素合并后C中的元素:
MergeList(A,B,&
/*将在顺序表A和B中的元素合并*/
=C.length;
i++)/*显示输出合并后C中所有元素*/
flag=GetElem(C,i,&
voidMergeList(SeqListA,SeqListB,SeqList*C)
/*合并顺序表A和B的元素到C中,并保持元素非递减排序*/
inti,j,k;
DataTypee1,e2;
i=1;
j=1;
k=1;
while(i<
=A.length&
&
=B.length)
GetElem(A,i,&
e1);
/*取出顺序表A中的元素*/
GetElem(B,j,&
e2);
/*取出顺序表B中的元素*/
if(e1<
=e2)/*比较顺序表A和顺序表B中的元素*/
InsertList(C,k,e1);
/*将较小的一个插入到C中*/
i++;
/*往后移动一个位置,准备比较下一个元素*/
k++;
else
InsertList(C,k,e2);
j++;
=A.length)/*如果A中元素还有剩余,这时B中已经没有元素*/
InsertList(C,k,e1);
/*将A中剩余元素插入到C中*/
i++;
k++;
while(j<
=B.length)/*如果B中元素还有剩余,这时A中已经没有元素*/
InsertList(C,k,e2);
/*将B中剩余元素插入到C中*/
j++;
C->
length=A.length+B.length;
/*C的表长等于A和B的表长的和*/
重点2:
voidInitList(LinkList*head)
/*将单链表初始化为空。
动态生成一个头结点,并将头结点的指针域置为空。
if((*head=(LinkList)malloc(sizeof(ListNode)))==NULL)/*为头结点分配一个存储空间*/
exit(-1);
(*head)->
next=NULL;
/*将单链表的头结点指针域置为空*/
intListEmpty(LinkListhead)
/*判断单链表是否为空,就是通过判断头结点的指针域是否为空*/
if(head->
next==NULL)/*判断单链表头结点的指针域是否为空*/
/*当单链表为空时,返回1;
ListNode*Get(LinkListhead,inti)
/*查找单链表中第i个结点。
查找成功返回该结点的指针表示成功;
否则返回NULL表示失败。
ListNode*p;
if(ListEmpty(head))/*在查找第i个元素之前,判断链表是否为空*/
returnNULL;
1)/*在查找第i个元素之前,判断该序号是否合法*/
j=0;
p=head;
while(p->
next!
=NULL&
i)
p=p->
next;
if(j==i)
returnp;
/*找到第i个结点,返回指针p*/
/*如果没有找到第i个元素,返回NULL*/
ListNode*LocateElem(LinkListhead,DataTypee)
/*查找线性表中元素值为e的元素,查找成功将对应元素的结点指针返回,否则返回NULL表示失败。
p=head->
/*指针p指向第一个结点*/
while(p)
if(p->
data!
=e)/*找到与e相等的元素,返回该序号*/
p=p->
break;
returnp;
intLocatePos(LinkListhead,DataTypee)
if(ListEmpty(head))/*在查找第i个元素之前,判断链表是否为空*/
return0;
p=head->
i=1;
while(p)
if(p->
data==e)/*找到与e相等的元素,返回该序号*/
returni;
else
{
p=p->
i++;
}
if(!
p)/*如果没有找到与e相等的元素,返回0,表示失败*/
intInsertList(LinkListhead,inti,DataTypee)
/*在单链表中第i个位置插入一个结点,结点的元素值为e。
插入成功返回1,失败返回0*/
ListNode*p,*pre;
/*定义指向第i个元素的前驱结点指针pre,指针p指向新生成的结点*/
pre=head;
/*指针p指向头结点*/
while(pre->
i-1)/*找到第i-1个结点,即第i个结点的前驱结点*/
pre=pre->
if(!
pre)/*如果没找到,说明插入位置错误*/
插入位置错"
/*新生成一个结点,并将e赋值给该结点的数据域*/
if((p=(ListNode*)malloc(sizeof(ListNode)))==NULL)
p->
data=e;
/*插入结点操作*/
next=pre->
pre->
next=p;
intDeleteList(LinkListhead,inti,DataType*e)
/*删除单链表中的第i个位置的结点。
删除成功返回1,失败返回0*/
ListNode*pre,*p;
pre->
next->
i-1)/*判断是否找到前驱结点*/
pre=pre->
j++;
if(j!
=i-1)/*如果没找到要删除的结点位置,说明删除位置错误*/
删除位置错误"
/*指针p指向单链表中的第i个结点,并将该结点的数据域值赋值给e*/
p=pre->
*e=p->
data;
/*将前驱结点的指针域指向要删除结点的下一个结点,也就是将p指向的结点与单链表断开*/
next=p->
free(p);
/*释放p指向的结点*/
intListLength(LinkListhead)
intcount=0;
=NULL)
p=p->
count++;
returncount;
voidDestroyList(LinkListhead)
ListNode*p,*q;
while(p!
q=p;
free(q);
例三:
/*包含头文件*/
malloc.h>
stdlib.h>
/*宏定义和单链表类型定义*/
typedefstructNode
DataTypedata;
structNode*next;
}ListNode,*LinkList;
LinkList.h"
/*包含单链表实现文件*/
voidDelElem(LinkListA,LinkListB);
/*删除A中出现B的元素的函数声明*/
voidDelElem2(LinkListA,LinkListB);
DataTypea[]={2,3,6,7,9,14,56,45,65,67};
DataTypeb[]={3,4,7,11,34,54,45,67};
LinkListA,B;
/*声明单链表A和B*/
/*初始化单链表A*/
/*初始化单链表B*/
i++)/*将数组a中元素插入到单链表A中*/
if(InsertList(A,i,a[i-1])==0)
i++)/*将数组b中元素插入单链表B中*/
if(InsertList(B,i,b[i-1])==0)
单链表A中的元素有%d个:
ListLength(A));
=ListLength(A);
i++)/*输出单链表A中的每个元素*/
p=Get(A,i);
/*返回单链表A中的每个结点的指针*/
if(p)
p->
data);
/*输出单链表A中的每个元素*/
单链表B中的元素有%d个:
ListLength(B));
=ListLength(B);
i++)
p=Get(B,i);
/*返回单链表B中的每个每个结点的指针*/
/*输出单链表B中的每个元素*/
DelElem2(A,B);
/*将在单链表A中出现的B的元素删除,即A-B*/
将在A中出现B的元素删除后(A-B),现在A中的元素还有%d个:
/*返回单链表A中每个结点的指针*/
/*显示输出删除后A中所有元素*/
voidDelElem(LinkListA,LinkListB)
inti,pos;
/*在单链表B中,取出每个元素与单链表A中的元素比较,如果相等则删除A中元素对应的结点*/
/*取出B中的每个结点,将指针返回给p*/
pos=LocatePos(A,p->
/*比较B中的元素是否与A中的元素相等*/
/*如果相等,将其从A中删除*/
voidDe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 例题 123