#include
#include
#include
struct node //定义结构体
{
int ch; //存放数据
struct node* next; //指向下一个结点
};
struct node* Create() //新建结点并初始化
{
struct node* n=(struct node*)malloc(sizeof(struct node));
n->ch=0;
n->next=NULL;
return n;
}
int main()
{
struct node *head=NULL,*p=NULL;
int n;
printf("\n请输入数据, 要结束, 请输入-1\n");
while(1)
{
scanf("%d",&n);
if(n==-1) break; //如果输入的是-1则表示用户结束输入
struct node *new_node;
new_node=Create(); //新建结点
new_node->ch=n; //把用户输入的数据存储入新结点中
if(head==NULL) //如果头结点为空,则把当前新结点当成头结点
{
head=new_node;
p=head; //当前指向为头结点
}
else //如果头结点不为空
{
p->next=new_node; //把上一个结点的next指向新建结点
p=p->next; //当前指向为新结点
}
}
//下面是输出全部数据
p=head; //重新指向头结点,以便输出
while(1)
{
printf("%5d",p->ch); //输出数据字符串
if(p->next==NULL) break; //如果当前结点没有指向下一个结点,则退出
p=p->next; //当前指向下一个结点
}
//下面是查寻数据
p=head;
struct node* prev=p; //记录上一个结点的指针
printf("\n请输入要删除的数据: ");
scanf("%d",&n);
bool find=false; //是否已找到该数据
while(1)
{
if(p->ch==n)
{
printf("\n找到:%d",p->ch);
if(p==head) //如果是头结点
{
head=p->next; //重新设置头结点
free(p); //释放该结点内存
find=true;
break;
}
else if(p->next==NULL) //如果是尾结点
{
free(p); //释放该结点内存
prev->next=NULL; //把尾结点掐掉
find=true;
break;
}
else
{
prev->next=p->next; //去掉本结点
free(p); //释放该结点内存
find=true;
break;
}
}
else if(p->next==NULL)
{
find=false;
break;
}
prev=p;
p=p->next;
}
if(find==false)
{
printf("\n未找到该数据\n");
}
else
{
printf("\n已删除该数据\n");
}
p=head; //重新指向头结点,以便输出
while(1)
{
printf("%5d",p->ch); //输出数据字符串
if(p->next==NULL) break; //如果当前结点没有指向下一个结点,则退出
p=p->next; //当前指向下一个结点
}
return 0;
}