单链表的增删查 逆置 倒数第k个节点等问题
对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针。在下面本人实现了单链表的增删插查改。#include<stdio.h>#include<assert.h>#include<malloc.h>#include<stdlib.h>typedefintDatatype;typedefstructSListNode{Datatypedata;structSListNode*next;}SListNode;voidPushBack(SListNode*&pHead,Datatypex);voidPopBack(SListNode*&pHead);voidPrintSlist(SListNode*&PHead);voidPushFrot(SListNode*&pHead,Datatypex);voidPopFront(SListNode*&pHead);SListNode*Find(SListNode*pHead,Datatypex);//voidInsert(SListNode*pHead,Datatypepos,Datatypex);voidInsert(SListNode*pHead,Datatypex);voidErase(SListNode*&pHead,SListNode*pos);voidInsertNoNode(SListNode*pos,Datatypex);SListNode*_BuyNode(Datatypex){SListNode*temp=(SListNode*)malloc(sizeof(SListNode));temp->data=x;temp->next=NULL;returntemp;}voidPushBack(SListNode*&pHead,Datatypex){//1空2不为空if(pHead==NULL){pHead=_BuyNode(x);}else{SListNode*tail=pHead;while(tail->next!=NULL){tail=tail->next;}tail->next=_BuyNode(x);}}voidPopBack(SListNode*&pHead){//1空2一个节点3多个节点if(pHead==NULL){return;}elseif(pHead->next==NULL){free(pHead);pHead=NULL;}else{SListNode*tail=pHead;SListNode*tem=NULL;while(tail->next!=NULL){tem=tail;tail=tail->next;}free(tail);tem->next=NULL;}}voidPrintSlist(SListNode*&PHead)//打印链表{SListNode*cur=PHead;while(cur!=NULL){printf("%d->",cur->data);cur=cur->next;}printf("NULL\n");}voidPushFrot(SListNode*&pHead,Datatypex)//头插{if(pHead==NULL){pHead=_BuyNode(x);}else{SListNode*tmp=_BuyNode(x);tmp->next=pHead;pHead=tmp;}}voidPopFront(SListNode*&pHead)//单链表头删{//1空//2一个结点//3一个以上的节点if(pHead==NULL){return;}elseif(pHead->next==NULL){free(pHead);pHead=NULL;}else{SListNode*tmp=pHead;pHead=pHead->next;free(tmp);}}SListNode*Find(SListNode*pHead,Datatypex)//查找节点{//assert(pHead);SListNode*tail=NULL;//当前指针Datatypetmp;//保存节点数据if(pHead->data==x){returnpHead;}else{tail=pHead->next;while(tail!=NULL){tmp=tail->data;if(tmp==x)//把节点数据与要查找的数比较{returntail;//返回所要查找结点的地址}else{tail=tail->next;}}printf("没有查到该数据!\n");}}voidInsert(SListNode*pos,Datatypex)////在指定节点插入数据{assert(pos);SListNode*tmp=_BuyNode(x);tmp->next=pos->next;pos->next=tmp;}voidErase(SListNode*&pHead,SListNode*pos)//删除指定位置的节点{assert(pos);assert(pHead);if(pHead==pos){pHead=pHead->next;free(pos);return;}SListNode*prv=pHead;while(prv){if(prv->next==pos){prv->next=pos->next;free(pos);break;}prv=prv->next;}}//删除一个无头单链表voidDelNoNode(SListNode*pos){assert(pos);assert(pos->next);SListNode*del=pos->next;SListNode*next=del->next;pos->data=del->data;pos->next=next;free(del);}//在无头单链表的一个非头节点前插入一个节点voidInsertNoNode(SListNode*pos,Datatypex){assert(pos);//assert(pos->next);//1种方法//Datatypetemp=0;//SListNode*behind=pos;//SListNode*prv=_BuyNode(x);//SListNode*next=behind->next;//pos->next=prv;//prv->next=next;//temp=pos->data;//pos->data=prv->data;//prv->data=temp;//2种方法SListNode*prv=_BuyNode(pos->data);prv->next=pos->next;pos->next=prv;pos->data=x;}//查找中间节点SListNode*FindmidNode(SListNode*phead){SListNode*fast=phead;SListNode*slow=phead;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;}returnslow;}//找倒数第k个节点SListNode*FindkNode(SListNode*phead,intk){SListNode*fast=phead;SListNode*slow=phead;/*for(inti=1;i<=k-1;i++){fast=fast->next;}while(fast->next){slow=slow->next;fast=fast->next;}*/while(fast&&k--){fast=fast->next;if(fast==NULL)returnNULL;}while(fast){slow=slow->next;fast=fast->next;}returnslow;}//从尾到头打印链表voidPrintTailToHead(SListNode*phead){if(phead){PrintTailToHead(phead->next);printf("%d",phead->data);}}//SListNode*Reverse(SListNode*phead)//单链表的逆置{SListNode*cur=phead;SListNode*newhead=NULL;while(cur){SListNode*tmp=cur;cur=cur->next;tmp->next=newhead;newhead=tmp;}returnnewhead;}voidtest1(){SListNode*list=NULL;PushBack(list,1);PushBack(list,3);PushBack(list,2);PushBack(list,4);PushBack(list,6);PrintSlist(list);}voidtest2(){SListNode*list=NULL;PushBack(list,1);PushBack(list,2);PushBack(list,3);PushBack(list,4);PushBack(list,5);PushBack(list,6);PushBack(list,7);PrintSlist(list);//Find(list,4);//Insert(list,7,8);SListNode*pos=Find(list,1);Erase(list,pos);PrintSlist(list);}voidtest3(){SListNode*list=NULL;PushBack(list,1);PushBack(list,2);PushBack(list,3);PushBack(list,4);PushBack(list,5);PushBack(list,6);PushBack(list,7);PrintSlist(list);SListNode*pos=Find(list,7);Insert(pos,2);PrintSlist(list);}voidtest4(){SListNode*list=NULL;PushBack(list,1);PushBack(list,2);PushBack(list,3);PushBack(list,4);PushBack(list,5);PushBack(list,6);PushBack(list,7);PrintSlist(list);/*SListNode*pos=list;DelNoNode(pos);*/SListNode*pos=Find(list,1);InsertNoNode(pos,9);PrintSlist(list);}voidtest5(){SListNode*list=NULL;PushBack(list,1);PushBack(list,8);PushBack(list,2);PushBack(list,3);PushBack(list,4);PushBack(list,5);PrintSlist(list);//SListNode*pos=FindmidNode(list);SListNode*pos=FindkNode(list,5);printf("%d\n",pos->data);//PrintSlist(list);}voidtest6(){SListNode*list=NULL;PushBack(list,1);PushBack(list,3);PushBack(list,2);PushBack(list,4);PushBack(list,6);//SListNode*pos=Reverse(list);PrintTailToHead(pos);}intmain(){//test1();test6();system("pause");return0;}
以上如果发现有错的地方或者还有其他建议,希望提出宝贵意见。谢谢!!!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。