预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10
亲,该文档总共80页,到这已经超出免费预览范围,如果喜欢就直接下载吧~
如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
课程设计一:线性表1、线性链表的基本操作线性表是一种常用且简单的一种数据结构,在掌握了线性表的顺序和链式存储结构后,我们从实际应用角度出发重新定义线性链表。带头结点的线性链表类型如图:Link或PositionLNodeLNodedatanextnextdata图1结点类型lenheaddatanextdatatailnext图2链表类型252NULLL图3具有两个结点且带头结点的线性链表/*c0.h(程序名)*/#include<string.h>#include<ctype.h>#include<limits.h>/*INT_MAX等*/#include<stdio.h>/*EOF(=^Z或F6),NULL*/#include<stdlib.h>/*atoi()*/#include<io.h>/*eof()*/#include<math.h>/*floor(),ceil(),abs()*/#include<process.h>/*exit()*//*函数结果状态代码*/#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE-1typedefintStatus;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/typedefintBoolean;/*Boolean是布尔类型,其值是TRUE或FALSE*//*c1.h带头结点的线性链表类型*/typedefstructLNode/*结点类型*/{ElemTypedata;structLNode*next;}LNode,*Link,*Position;typedefstructLinkList/*链表类型*/{Linkhead,tail;/*分别指向线性链表中的头结点和最后一个结点*/intlen;/*指示线性链表中数据元素的个数*/}LinkList;/*bo1.c带头结点的线性链表的24个基本操作*/StatusMakeNode(Linkp,ElemTypee){/*分配由p指向的值为e的结点,并返回OK;若分配失败。则返回ERROR*/p=(Link)malloc(sizeof(LNode));if(!p)returnERROR;p->data=e;returnOK;}voidFreeNode(Linkp){/*释放p所指结点*/free(p);p=NULL;}StatusInitList(LinkListL){/*构造一个空的线性链表*/Linkp;p=(Link)malloc(sizeof(LNode));/*生成头结点*/if(p){p->next=NULL;L.head=L.tail=p;L.len=0;returnOK;}elsereturnERROR;}StatusClearList(LinkListL){/*将线性链表L重置为空表,并释放原链表的结点空间*/Linkp,q;if(L.head!=L.tail)/*不是空表*/{p=q=L.head->next;L.head->next=NULL;while(p!=L.tail){p=q->next;free(q);q=p;}free(q);L.tail=L.head;L.len=0;}returnOK;}StatusDestroyList(LinkListL){/*销毁线性链表L,L不再存在*/ClearList(L);/*清空链表*/FreeNode(L.head);L.tail=NULL;L.len=0;returnOK;}StatusInsFirst(LinkListL,Linkh,Links)/*形参增加L,因为需修改L*/{/*h指向L的一个结点,把h当做头结点,将s所指结点插入在第一个结点之前*/s->next=h->next;h->next=s;if(h==L.tail)/*h指向尾结点*/L.tail=h->next;/*修改尾指针*/L.len++;returnOK;}StatusDelFirst(LinkListL,Linkh,Linkq)/*形参增加L,因为需修改L*/{/*h指向L的一个结点,把h当做头结点,删除链表中的第一个结点并以q返回。*//*若链表为空(h指向尾结点),q=NULL,返回FALSE*/q=h->next;if(q)/*链表非空*/{h->next=q->next;