单链表各种操作的C语言实现Word下载.docx

上传人:b****5 文档编号:16212453 上传时间:2022-11-21 格式:DOCX 页数:16 大小:20.76KB
下载 相关 举报
单链表各种操作的C语言实现Word下载.docx_第1页
第1页 / 共16页
单链表各种操作的C语言实现Word下载.docx_第2页
第2页 / 共16页
单链表各种操作的C语言实现Word下载.docx_第3页
第3页 / 共16页
单链表各种操作的C语言实现Word下载.docx_第4页
第4页 / 共16页
单链表各种操作的C语言实现Word下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

单链表各种操作的C语言实现Word下载.docx

《单链表各种操作的C语言实现Word下载.docx》由会员分享,可在线阅读,更多相关《单链表各种操作的C语言实现Word下载.docx(16页珍藏版)》请在冰豆网上搜索。

单链表各种操作的C语言实现Word下载.docx

L=q;

/*将L重置为空表*/

StatusClearList(structLNode*L)

LinkList*p,*q;

p=L->

while(p)

q=p->

free(p);

p=q;

L->

/*判断链表是否为空表*/

StatusListEmpty(LinkList*L)

if(L->

next)

returnFALSE;

else

returnTRUE;

/*返回单链表中元素的个数*/

intListLength(structLNode*L)

inti=0;

LinkList*p=L->

i++;

p=p->

returni;

/*L为带头节点的单链表的头指针,当第i个元素存在时,其值赋给e,并返回OK*/

StatusGetElem(structLNode*L,inti,ElemType*e)

intj=1;

while(p&

&

j<

i)

j++;

p||j>

returnERROR;

*e=p->

data;

/*返回L中第一个与e满足关系compare()的数据元素的位序,

若给存在返回值为0,compare()是数据元素的判定函数*/

intLocateElem(structLNode*L,ElemTypee,Status(*compare)(ElemType,ElemType))

if(compare(p->

data,e))

p=p->

return0;

/*所cur_e是L中的数据元素,且给就第一个,则用pre_e返回它的前驱*/

StatusPriorElem(structLNode*L,ElemTypecur_e,ElemType*pre_e)

LinkList*q,*p=L->

while(p->

//q指向p的后继

if(q->

data==cur_e)

*pre_e=p->

returnINFEASIBLE;

/*若cur_e是L中的数据元素,且不是最后一个,则用next_e返回它的后继*/

StatusNextElem(structLNode*L,ElemTypecur_e,ElemType*next_e)

LinkList*p;

if(p->

*next_e=p->

next->

/*在带头节点的单链表L中的第i个位置之前插入元素e*/

StatusListInsert(structLNode*L,inti,ElemTypee)

intj=0;

structLNode*p=L,*s=NULL;

i-1)

s=(structLNode*)malloc(sizeof(structLNode));

s)

printf("

mallocerror~\n"

);

//p->

next=s;

s->

data=e;

next=p->

p->

//s->

next=NULL;

//p=s;

/*在带头节点的单链表中删除第i个元素,并有e返回其值*/

StatusListDelete(LinkList*L,inti,ElemType*e)

LinkList*p=L,*q;

intj=0;

next&

i-1)

next||j>

next=q->

*e=q->

free(q);

/*依次对L的每个元素调用vi(),打印输出语句*/

StatusListTraverse(structLNode*L,void(*vi)(ElemType))

vi(p->

data);

\n"

/*对单链表进行排序处理*/

structLNode*sort(structLNode*head)

LinkList*p;

intn,i,j;

inttemp;

n=ListLength(head);

if(head==NULL||head->

next==NULL)

returnhead;

p=head->

for(j=1;

j<

n;

++j)

for(i=0;

i<

n-j;

++i)

data>

p->

data)

temp=p->

data=p->

data=temp;

/*对单链表进行逆置*/

LinkList*reverse(LinkList*head)

LinkList*p1,*p2=NULL,*p3=NULL;

p1=head->

while(p1!

=NULL)

p3=p1->

p1->

next=p2;

p2=p1;

p1=p3;

head->

//head=p2;

Statusequal(ElemTypec1,ElemTypec2)

if(c1==c2)

returnTRUE;

returnFALSE;

/*将所有在线性表Lb中但不在La中的数据元素插入到La中*/

voidUnion(LinkList*La,LinkList*Lb)

ElemType*e;

intLa_len,Lb_len;

inti;

La_len=ListLength(La);

Lb_len=ListLength(Lb);

for(i=1;

=Lb_len;

i++)

GetElem(Lb,i,e);

//取Lb中第i个元素赋给e

LocateElem(La,*e,equal))//La中不存在和e相同的元素,则插入

ListInsert(La,++La_len,*e);

voidprint(ElemTypec)

%4d"

c);

/*合并两个单链表,La和Lb中的数据是按非递减排列,归并后的Lc还是安非递减排列*/

voidMergeList(LinkList*La,LinkList*Lb,LinkList**Lc)

inti=1,j=1,k=0;

ElemType*ai,*bj;

ai=(ElemType*)malloc(sizeof(ElemType));

bj=(ElemType*)malloc(sizeof(ElemType));

InitList(Lc);

while(i<

=La_len&

=Lb_len)

GetElem(La,i,ai);

GetElem(Lb,j,bj);

if(*ai<

*bj)

ListInsert(*Lc,++k,*ai);

++i;

ListInsert(*Lc,++k,*bj);

++j;

=La_len)

GetElem(La,i++,ai);

while(j<

GetElem(Lb,j++,bj);

/*只遍历一次,找到单链表中的中间节点

1定义两个指针,一个指针每次移动两个步长(快指针),另一个指针每次移动一个数据(慢指针)

2.当快指针到达链表尾部的时候,慢指针就到了链表的中间节点

在程序中也可以判断一个单链表是否有环,如果快指针一定能够追赶上慢指针,否则就会以NULL结束*/

LinkList*Searchmid(LinkList*head)

if(NULL==head)

returnNULL;

if(head->

LinkList*mid=head;

LinkList*p=mid->

while((p!

=NULL)&

(NULL!

=p->

next))

mid=mid->

returnmid;

下面主要是单链表的一个测试的程序。

Statuscomp(ElemTypec1,ElemTypec2)

if(c1==c2)

voidvisit(ElemTypec)

voidmain()

LinkList*L;

LinkList*mid;

mid=(structLNode*)malloc(sizeof(structLNode));

ElemType*e,e0,*e1;

Statusi;

intj,k;

e=(ElemType*)malloc(sizeof(ElemType));

e1=(ElemType*)malloc(sizeof(ElemType));

i=InitList(&

L);

for(j=1;

=6;

j++)

i=ListInsert(L,1,j);

在L的表头依次插入1~6后:

L="

ListTraverse(L,visit);

L中间节点的值为mid=:

"

mid=Searchmid(L);

%d\n"

mid->

L逆置后的输出:

ListTraverse(reverse(L),visit);

L排序后依次为:

ListTraverse(sort(L),visit);

i=ListEmpty(L);

L是否为空:

i=%d(1:

是,0:

否)\n"

i);

i=ClearList(L);

清空L后:

L是否为空:

i=%d\n"

=10;

ListInsert(L,j,j);

在L的表尾依次插入1~10后:

GetElem(L,5,e);

第5个元素的值为:

*e);

for(j=0;

=1;

k=LocateElem(L,j,comp);

if(k)

第%d个元素的值为%d\n"

k,j);

没有值为%d的元素\n"

j);

=2;

GetElem(L,j,e1);

i=PriorElem(L,*e1,e);

if(i==INFEASIBLE)

元素%d无前驱\n"

*e1);

元素%d的前驱为:

*e1,*e);

for(j=ListLength(L)-1;

=ListLength(L);

i=NextElem(L,*e1,e);

if(i==INFEASIBLE)

元素%d无后继\n"

元素%d的后继为:

k=ListLength(L);

for(j=k+1;

j>

=k;

j--)

i=ListDelete(L,j,e);

if(i==ERROR)

删除第%d个数据失败\n"

删除的元素为:

依次输出L的元素:

DestroyList(L);

销毁L后:

L=%u\n"

L);

*************************************************\n"

LinkList*La,*Lb;

La);

if(i==1)

=5;

i=ListInsert(La,j,j);

La="

ListTraverse(La,print);

InitList(&

Lb);

i=ListInsert(Lb,j,2*j);

Lb="

ListTraverse(Lb,print);

Union(La,Lb);

newLa="

LinkList*La_1,*Lb_1,*Lc_1;

inta[4]={3,5,8,11},b[7]={2,6,8,9,11,15,20};

La_1);

=4;

ListInsert(La_1,j,a[j-1]);

La_1="

ListTraverse(La_1,print);

Lb_1);

=7;

ListInsert(Lb_1,j,b[j-1]);

Lb_1="

ListTraverse(Lb_1,print);

MergeList(La_1,Lb_1,&

Lc_1);

Lc_1="

ListTraverse(Lc_1,print);

下面是在Linux下的部分运行结果:

L=654321

4

L=123456

i=0(1:

否)

L=

i=1

L=12345678910

5

没有值为0的元素

第1个元素的值为1

元素1无前驱

元素2的前驱为:

1

元素9的后继为:

10

元素10无后继

删除第11个数据失败

123456789

L=7954544

*************************************************

La=12345

Lb=246810

newLa=123456810

La_1=35811

Lb_1=2689111520

Lc_1=235688911111520

StatusInitList_CL(structLNode**L)

next=*L;

StatusDestroyList_CL(structLNode*L)

structLNode*q=L->

next,*p=(L)->

while(q!

=(L))

L=NULL;

StatusClearList_CL(structLNode*L)

L=L->

while(p!

=L)

next=L;

StatusListEmpty_CL(LinkList*L)

next==L)

re

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 自考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1