问题及代码:
/*
*Copyright (c) 2014,烟台大学计算机学院
*All rights reserved.
*文件名称:lily.cpp
*作者:李莉
*完成日期:2015年6月3日
*版本号:v1.0
*问题描述:编写函数void search(int x),输出链表中是否有值为x的结点。
删除链表中的特定结点
程序输入:输入若干正数
*程序输出:运行结果
*/
#include <iostream>
#include <cstdio>
using namespace std;
struct Node
{
int date;
struct Node *next;
};
Node *head=NULL;
void make_list();
void out_list();
void search(int x);
void deletex(int x);
int main()
{
int b;
make_list();
out_list();
cout<<"请输入要查询的结点:"<<endl;
cin>>b;
search(b);
cout<<"请输入要删除的结点:"<<endl;
int a;
cin>>a;
deletex(a);
out_list();
return 0;
}
void make_list()
{
int n;
Node *p,*q;
cout<<"请输入若干正数,以0或负数表示输入结束:";
cin>>n;
while(n>0)
{
p=new Node;
p->date=n;
p->next=NULL;
if(head==NULL)//第一次把head设定为空指针是为了找到头结点的位置
head=p;
else
q->next=p;
q=p;
cin>>n;
}
return;
}
void out_list()
{
Node *p=head;
cout<<"链表中的数据为:";
while(p!=NULL)
{
cout<<p->date<<" ";
p=p->next;
}
cout<<endl;
return;
}
void search(int x)
{
Node *p=head;
while(p!=NULL&&p->date!=x)
{
p=p->next;
}
if(p!=NULL)
cout<<"链表中有值为"<<x<<"的结点"<<endl;
else
cout<<"链表中没有值为"<<x<<"的结点"<<endl;
return;
}
void deletex(int x)
{
Node *p,*q;
if(head==NULL)
cout<<"空链表,不能删除!"<<endl;
else
{
while(head!=head&&head->date==x)
{
p=head;
head=head->next;
delete p;
}
if(head!=NULL)
{
p=head;
q=p->next;
while(q!=NULL)
{
if(q->date==x)
{
p->next=q->next;
delete q;
}
else
p=q;
q=p->next;
}
}
}
return ;
}
运行结果:
心得体会:
首先找到要删除的结点的位置,判断是不是位于特殊位置,例如头结点,如果位于头结点,则要特殊处理,如果不是位于头结点,则要用两个指针辅助处理,一个指针标记位置,一个指针负责前进