C语言数据结构 link 链表反转的实现
C语言数据结构link链表反转的实现
链表反转,示例如下:
偶数个输入:a->b->c->d->e->f
偶数个输出:e->f->c->d->a->b
or
奇数个输入:a->b->c->d->e->f->g
偶数个输出:g->e->f->c->d->a->b
#include#include #include /**************startofstack*************/ #defineSTACK_SIZE1024 charstack[STACK_SIZE]; inttop=0; voidpush(charch){ stack[top]=ch; top++; } charpop(){ top--; returnstack[top]; } intisempty(){ return0==top; } voidtest_stack(){ push('a'); push('b'); push('c'); push('d'); while(!isempty()){ printf("popch:%c\n",pop()); } } /**************endofstack*************/ struct_node{ chardata; struct_node*next; }; typedefstruct_nodenode,*plink; plinkinit_link(){ plinkpl; pl=(plink)malloc(sizeof(node)); //checkmallocsuccessornot if(NULL==pl){ printf("mallocmemoryfail..."); returnNULL; } //initlinkhead pl->data='\0'; pl->next=NULL; returnpl; } voidinput_data(plinkpl,chardata){ plinkp=pl; while(p->next){ p=p->next; } plinknode=NULL; node=(plink)malloc(sizeof(node));//mallocanewnode //adddata if(NULL!=node){ node->data=data; node->next=p->next;//lastnextisNULL p->next=node; p=node;//ppointlastnode } } voidoutput_link(plinkpl){ if(NULL==pl){ printf("plinkisnull"); return; } plinkp=pl->next;//alreadycheckplisNULL,sohereisok while(NULL!=p){ printf("%c->",p->data); p=p->next; } printf("\n\n"); } //pushandpopstack plinkrevert_link2(plinkpl){ plinkp=pl; while(p->next){ //printf("p->data:%c\n",p->next->data); if(p->next->next){ push(p->next->next->data); push(p->next->data); p=p->next->next; }else{ push(p->next->data); p=p->next; } } while(!isempty()){ printf("%c->",pop()); } printf("\n\n"); returnNULL; } plinkrevert_link(plinkpl){ if(NULL==pl){//checklinkisNULL returnNULL; } intlink_len=0; plinktmp_pl=pl->next; while(tmp_pl){//countlinkcount link_len++; tmp_pl=tmp_pl->next; } //linklengthisnomorethantwonode(s) if(link_len<=2){ returnpl; } //linklengthismorethantwonodes returnrevert_link2(pl); } intmain(){ plinkpl=NULL; pl=init_link();//initlinkhead input_data(pl,'a');//adddata input_data(pl,'b'); input_data(pl,'c'); input_data(pl,'d'); input_data(pl,'e'); input_data(pl,'f'); input_data(pl,'g'); output_link(pl); plinkpl2=revert_link(pl); output_link(pl2); return0; } /**** revert_link.c linuxgcccompile gccrevert_link.c-orevert_link&&./revert_link outputresult: a->b->c->d->e->f->g g->e->f->c->d->a->b or a->b->c->d->e->f e->f->c->d->a->b ****/
间隔螺旋反转:
输入:a->b->c->d->e->f
输出:b->a->d->c->f->e
plinkrevert_link3(plinkpl){ if(NULL==pl){ printf("plinkisnull"); returnNULL; } plinkp=pl; plinkfirst=p->next; while(NULL!=first){ plinksecond=first->next; if(NULL!=second){ first->next=second->next;//thirdnode second->next=first;//reverttwonodes first=first->next; p->next=second; p=second->next; } } returnpl; }
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。