#include
//动态链表的创建:
//编写函数creat_list,建立带有头节点的单向链表,节点数据域中的值由键盘输入,以-1作为输入结束标志,链表头结点的地址由函数返回
#include
typedef struct slist
{
int data;
struct slist *next;
} ST;
ST *creat_list()
{
int c;
ST *h,*s,*r;
h=(ST *)malloc(sizeof(ST));//生成头节点
r=h;
scanf("%d",&c);
while(c!=-1)
{
s=(ST *)malloc(sizeof(ST));//生成新的节点
s->data =c;
r->next =s;//新节点链接到表的末尾
r=s;//指向链表的末尾
scanf("%d",&c);
}
r->next ='\0';//链表的结束标志
return h;//返回链表的头节点
}
//编写函数print_list,顺序输出单项链表各个节点中数据域中的值
void printf_list(ST *head)
{
ST *p;
p=head->next ;//指向头结点后的第一个节点
if(p=='\0') printf("空链表\n");
else
{
printf("head");
do
{
printf("-->%d",p->data );
p=p->next ;//p指向下一个节点
}
while(p!='\0');
printf("-->end\n");
}
}
//编写函数insert_node,在值为x的节点前插入值为y的节点,若值为x的节点不存在,则插在末尾
void insert_node(ST *head,int x,int y)
{
ST *s,*p,*q;
s=(ST *)malloc(sizeof(ST));//生成新的节点
s->data =y;//新节点中存入y值
q=head;
p=head->next ;
while((p->data !=x)&&(p !='\0'))
{
q=p;
p=p->next ;
}
s->next =p;
q->next =s;
}
//编写函数delete_list,删除链表中值为x的节点,并释放对应的存储空间
void delete_list(ST *head,int x)
{
ST *p,*q;
q=head;
p=head->next ;
while((p!='\0')&&(p->data !=x))
{
q=p;
p=p->next ;
}
if(p=='\0')
printf("tan90\n");
else
{
q->next =p->next ;
free(p);
}
}
void main()
{
ST *head;
int x,y;
head=creat_list();//创建链表
printf_list(head);//输出链表
printf("输入查找值:");
scanf("%d",&x);
printf("输入插入值:");
scanf("%d",&y);
insert_node(head,x,y);
printf_list(head);//输出链表
printf("输入需要删除值:");
scanf("%d",&x);
printf("需要删除值为:%d\n",x);
delete_list(head,x);
printf_list(head);//输出链表
}