原题:使用后置递归法求解删除带有头结点的单链表中所有值为x的数据元素的算法。
(1)采用后置递归算法删除指定结点
#include<iostream.h> #include<stdlib.h> #include<time.h> typedef struct LNode {//定义表结点结构 char data; struct LNode *next; }LNode,*LinkList; int CreateList(LinkList &head)//生成链表 { srand((unsigned)time(NULL)); LinkList p=NULL,q=NULL;head=NULL; for(int i=0;i<20;i++) { p=new LNode; p->data=(char)(rand()%26+'a'); if(head == NULL) head=p; else q->next=p; q=p; } if(head!=NULL) { q->next=NULL; } head->data='*';//头结点数据域为特殊字符*号 return 1; } void DelListNode(LinkList &head,char ch) { LinkList h,p; if(head->next) { if(head->next->data == ch) { //删除head->next p=head->next;head->next=p->next;delete p; h=head;//h为线性链表(a2,a3, ... an)的头指针 } else h=head->next;//h为线性链表(a2,a3, ... an)的头指针 DelListNode(h,ch);//处理线性链表(a2,a3, ... an) } } int DisplayList(LinkList head)//打印链表中所有结点的数据 { if(head==NULL) { cout<<"当前链表为空!"<<endl<<endl;return -1; } LinkList p=head; while(p->next != NULL) { cout<<p->data<<" -> "; p=p->next; } cout<<p->data<<endl<<endl;//打印最后一个结点的数据 return 1; } void main() { LinkList head; CreateList(head); cout<<"初始生成的链表的数据为:"<<endl; DisplayList(head); char ch; cout<<"你要删除链表中的哪个字母,请输入:"; cin>>ch; DelListNode(head,ch); cout<<"删除字母后"<< ch <<"的链表的数据为:"<<endl; DisplayList(head); }
(2)在遍历过程中删除指定结点
#include<iostream.h> #include<stdlib.h> #include<time.h> typedef struct LNode {//定义表结点结构 char data; struct LNode *next; }LNode,*LinkList; int CreateList(LinkList &head)//生成链表 { srand((unsigned)time(NULL)); LinkList p=NULL,q=NULL;head=NULL; for(int i=0;i<20;i++) { p=new LNode; p->data=(char)(rand()%26+'a'); if(head == NULL) head=p; else q->next=p; q=p; } if(head!=NULL) { q->next=NULL; } head->data='*';//头结点数据域为特殊字符*号 return 1; } void DelListNode(LinkList &head,char ch) {//在遍历过程中删除指定结点(数据域值为ch的结点) LinkList h,p,pre=head; while(pre->next) { if(pre->next->data == ch) { p=pre->next; pre->next=p->next;delete p; } if(pre->next != NULL) { pre=pre->next; } } } int DisplayList(LinkList head)//打印链表中所有结点的数据 { if(head==NULL) { cout<<"当前链表为空!"<<endl<<endl;return -1; } LinkList p=head; while(p->next != NULL) { cout<<p->data<<" -> "; p=p->next; } cout<<p->data<<endl<<endl;//打印最后一个结点的数据 return 1; } void main() { LinkList head; CreateList(head); cout<<"初始生成的链表的数据为:"<<endl; DisplayList(head); char ch; cout<<"你要删除链表中的哪个字母,请输入:"; cin>>ch; cout<<endl; DelListNode(head,ch); cout<<"删除字母后"<< ch <<"的链表的数据为:"<<endl; DisplayList(head); }
(3)消除递归(1)中的递归算法
#include<iostream.h> #include<stdlib.h> #include<time.h> typedef struct LNode {//定义表结点结构 char data; struct LNode *next; }LNode,*LinkList; int CreateList(LinkList &head)//生成链表 { srand((unsigned)time(NULL)); LinkList p=NULL,q=NULL;head=NULL; for(int i=0;i<20;i++) { p=new LNode; p->data=(char)(rand()%26+'a'); if(head == NULL) head=p; else q->next=p; q=p; } if(head!=NULL) { q->next=NULL; } head->data='*';//头结点数据域为特殊字符*号 return 1; } void DelListNode(LinkList &head,char ch) {//将(2)中的递归算法改为非递归算法(即消除递归),删除指定结点(数据域值为ch的结点) LinkList h,p,la=head; while(la->next) { if(la->next->data == ch) { p=la->next; la->next=p->next;delete p;//删除la->next h=la;//h为线性链表(a2,a3, ... an)的头指针 } else h=la->next;//h为线性链表(a2,a3, ... an)的头指针 la=h;//la为线性链表(a2,a3, ... an)的头指针 } } int DisplayList(LinkList head)//打印链表中所有结点的数据 { if(head==NULL) { cout<<"当前链表为空!"<<endl<<endl;return -1; } LinkList p=head; while(p->next != NULL) { cout<<p->data<<" -> "; p=p->next; } cout<<p->data<<endl<<endl;//打印最后一个结点的数据 return 1; } void main() { LinkList head; CreateList(head); cout<<"初始生成的链表的数据为:"<<endl; DisplayList(head); char ch; cout<<"你要删除链表中的哪个字母,请输入:"; cin>>ch; cout<<endl; DelListNode(head,ch); cout<<"删除字母后"<< ch <<"的链表的数据为:"<<endl; DisplayList(head); }