1、数据结构常用算法实现print线性表的顺序表示程序2_.提供了顺序存储结构下线性表的实现。第1行定义了一个常数值AXSIZE.它是一个常数,表示线性表的最大长度。第2行把LEMTYPE设置为t的一个别名.这样,这个例子就可以使用一组整数了.第3行到第7行包含了线性表的说明。接下来从第8行到第46行线性表运算函数的定义.第8到第11行将线性表置成空表,只需简单地将线性表元素个数置成即可。由于线性表的长度已经记录在结构成员length中,因此求线性表的长度(第35行到第3行)只是返回length的值.第2到第2行是追加函数,函数apend在线性表的表尾插入一个元素.第1行到第9行是插入函数。在表中
2、第i位置插入一个新元素te时,需将i,1,n1位置上的元素向后移,变成编号为i+1,i+2,,n,然后将tem插入到第i个位置,且线性表的长度加1。第25行到第4行是删除元素。要删去表中位置i上的元素,同样需要移动表中元素,使原编号为i1,i+,,n1的元素变成编号为,i+1,,n-,并将表的长度减1。第39行到第4行的函数fid在线性表中查找第一个出现的值为item的元素。如果值ite找到了,函数返回元素item所在位置1,否则返回1.第54行到第行是main函数的一个例子,说明了线性表的使用。57行调用lear 函数将线性表清空,第58,9,60三行调用apped函数追加三个元素,第62行
3、在位置插入一个元素15,第65行调用elet函数删除位置3的元素。第4行到53行的print函数是为了显示线性表中的数据而设置的。程序2_1c1 ineMAXSZE 9992tydf n ELMTYPE;3 trut li4LEMTPlstarayMAXIZE;5 ntlnth;6;src ls l;8 vidcer()9 10enth =0;11 12void inst(nt os,ELETPEitem) 14int i;1for(i =l.length;pos;i)16 l.listrayi =l.litarrayi;1 。istrrap =tem;18 l.lgth;190void ap
4、e(EEMTYE item)22 l。litaralngth+ item;2 2LEMTYdete(in o)2627 in ;2 EEYPEtemp;29 tep =l。lstrayos;30fo(i pos;i。ng-1;i+)1 l。saryi = 。istarra+1;2 l.lngt-; ret temp;5nt length()7rern l.leth; 3 i id(ELMTY itm)0 it i; fo (=0;ielement = te;27 = d;8 1;29 ile (p!=NU) & (jpos) 3 p = pnxt;31 j+;32 i(!)|(jp) retn
5、 0;4 s-et = p-et;35 p-nxt = s;6if (til = p) ail s;37 etu1;38 9 ELEMPE deet(int pos)041 trct list p,;4 ELEMYPtep;43 intj;44 p; = heanext;5j = 1;6 hile (p!=NUL) & (jp))47 q p; p = pnt;48 j+;4 50if((!p)|(jpos)51 return052 qxt next;53 tm = element;54 i (l = p) ta = q;5r();5 retunemp;7 58 it lengh()5960
6、stuctlist ;61 intcnt0;2 or(p head-nt;p !=NL; p-nex)63 cnt+;6reur cnt;65 6intfind(LEMTY ite)67 6 truc lst p = headnext;69 while (!=ULL) 7 if (-eement = item)71 rtu 1;2 else3 p = p-nex;7475 retn ;76 77vid pnt()787 struct ls*;8 ntf(”n);8 fr (p= ead-nxt;!ULL;pp-ne)82 print(”d,peemet);8384 voidin()8 86 c
7、lrsc();87 it();88 ape(10); /* lit (0) */9 append(0); st i (1,0) */90 apd(30); * ist i(1,20,30)91pp(0); / st is(10,20,0,40) /92 insert(3,3);/ listis (10,0,3,40) /93 rint();4print(nd,elte(4); /* listis (10,20,30,35) *95prin();96 栈程序_3.是栈数据结构的实现,第3行到第6行包含栈类型的说明, p被定义为表示栈中最上面那个元素的位置.push(第13行到第17行)和pop(
8、第18行到第行)只是从tp指示的数组中的位置插入和删去一个元素,因为op表示栈顶元素的位置,所以push首先把一个值插入到栈顶位置,然后把top加1。同样,首先把tp减1,然后删去栈顶元素。 函数toVlue(第23行到7行)只是将栈顶元素返回。如果栈中没有元素,函数sEmpy(第28行到第31行)返回1,否则返回0。程序2_3.cinclde#efineAXSZE 100tpde int ELEMTYP;struc stack LEMYPE ltarayMAXSIE;in to;;structs ;vid int() sop = 0;void ph(ELEMTYPE itm) assert(
9、s。topMXSIZ); s.litaays。top+= im;EMTPE op()int isEmpy(); asert(!Ept(); return s.lstarray-s.top;ELEMTYPEpVue() n ismpty(); sse(!ismpty(); retun.listarra。top1;it isEmp() reurn s. = 0;vi mai() init(); push(10); / is (10)/puh(20); s s(20,10) */ prntf(%d,topVale(); /rturn tp eement20*/ intf(n); prit(d,pop
10、();/ sis (10)*/程序2_c给出了链式栈表示和各种运算的算法。其中to是指向链式栈第一个结点(栈顶)的指针。进栈操作(第13行到第21行)首先申请一个新结点,并初始化该结点,然后修改新产生的结点的ne域指向栈顶,并设置to指向新的链表结点。第22行到第3行是出栈操作.变量emp用来存储栈顶结点的值,tmp用于在删去栈顶结点时保持与栈的链接,它指向当前栈顶链接到的结点。此时把原来的栈顶结点释放回内存,恢复to等于lep.也就是指向原来栈顶链接的结点,原来栈顶的值emp作为op函数的返回值.程序2_4.c nclue lde assethtypedefin ELEMTPE;strt n
11、ode EEMTPE le; stuctnde nex;;truc nd ; voi ini() top ULL;vi push(ELEMTYP item) stuct nod *p; (p=(truct node )maloc(sizef(sruct nod)!=NULL) plem =ie; pnext t;op = p; ELETYPE pop()nsEmpty();LMYEtmp; suct nd lemp; asert(!isEpy()); temp topeem;ltemp = tpt;free(to);tp = tep; rturn ep; ELEMPE toVlue() int
12、 isEmty(); set(!ip()); return topelm;it isEmpt() eturn top = NLL; od ain() int(); ush(1); / sis (10)*/ push(20); /* ss(,1) *push(0); / is (3,20,1) rif(%dn,toue()); printf(%dn”,op()); /* s is (20,1)/队列在程序2_.c中,q表示循环队列(第3行到第9行),其队头与队尾指示变量分别为font和rear。队列中的元素类型为in(第3行).函数enueue(第4行到第19行)执行队列的插入操作,参数item
13、是插入队列的元素.当队列不满时,nqueue首先移动队尾指针,然后将item置入rear所指位置。函数dqueue(第20行到行)执行队列的删除操作,返回从队列中取出的元素。函数fistle(第26行到第30行)返回队列头元素。程序2_5.ccde asserthicludestdiohefie MAXSZE 0type i ELMTYPE;tuct queue n front;a;LMYPE elemMAXSIZ;sructqueueq;voi nit() rot= qrear = 0;voiqueue(ELEMTPE im) assr((qear+1)% MAXSIE)!= q.front
14、); qrear = (q。rear +1) MASIZE; incremt rear / q。lemq.r im; LEMTP dequeu() / dequeue leent rofof qeue / nt ismpty(); sset(!isEpty());/thermut be omethigdeqee* qrot= (q。front 1) MAXSI; /* incemnrt / tur q.elemq。front; /* rtuvaue */ ELMTYE firstValue() / get valueof frolemen / int Empty(); ssert(!iEmty
15、(); return qelm(q.frnt+1) MAXSZE; intismpy()/* TRUEs queue isemty */ returnq.front= .ar; voidmain() int();equue(0); /* is (10)/ enqueue(20); /* q i (10,20)*/nque(0); / q is(10,30)*/ prnf(%d”,firstlue();* ll display10/ri(n”,dequee()); /will sp 10 *程序6c给出了链式队列的说明和函数的实现。font和ra分别是指向队首和队尾元素的指针.链式队列的实现不需
16、要表头结点,当队列为空时,指针ron和rea的值均为空(LL)。当在队列中插入一个结点时(第14行到27行),新结点链入rear所指结点的next域,并使rear指向新的结点。如果在插入之前队列为空,则指针frot指向新插入的结点。当从队列中删除一个结点时(第8行到3行),要把font所指结点的net域的值赋给fnt,并且释放这个结点。如果删除之后队列为空,则置指针rear为空(ULL)。程序_6。c#includemalc。hincldsto。h incle nxt=(suctode*)mllc(sieof(srctnod); rearxelem ite; rernextnx= L; rar
17、= rernet; else ft=ear=(struc de*)mlc(sizef(sut ode)); rotele = ie; fron-nex NU; ELETPE dequeue()ntsEmpt(); EMTYE temp= rot-lem; rutnode *ltmp = fron; assert(!iEmty(); fron = frntnet;fre(ltep); if(ront=NUL) ear = NUL; tun em; LEMYPE firsaue() int iEmpty();assert(!isEmpty(); rtu frn-elem; int smpty()
18、reurn frot = NUL; oidmai() t(); nqueu(10);enqueue(20); enqueue(30); pr(”n”,irstVale(); pntf(%dn,equeue(); 稀疏矩阵程序31.c是按照快速转置算法求矩阵的转置。程序第2行给出稀疏矩阵的三元组表表示.函数FastTranpos按照快速转置算法思想将稀疏矩阵a转置为稀疏矩阵b,b也表示为三元组表形式。第11行到第13行计算矩阵a的每一列的非零元素个数。第15行计算a中每一列第一个非零元素在中的起始位置.第16行第22行对a中的元素依此进行转置。程序1。c1 #define MAXCL 002it a3 7,6,8,0,0,5,0,3,2,0,5,8,,6, 1,2,9,2,3,3,,,9,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1