包括链表的创建删除添加和释放操作!!
#includ农e
#include
stru全液翻ctnode*create();
voidprint_list(structnode*head);
structnode*insert_node(structnode*h,intx,inty);
structnode*delete_node(structnode*h,intz满事料汉令读画底);
voidshifang(s离点敌氢测无头际步相tructnode*head);
structnode
{
chardata;
structnode*next;
};
voidmain()
{
structnode*head;
intx,y,z;
head=create();
print_list(李排首式效胡停即帝衣白head);
printf("\n输入插入结点的位置的值和插入的数值:");
scanf("%d%d"副国站把完我景护系非,&x,&y);
h武话居越委呼封队营ead=insert_node每几无达世时(head,x,y);
pri财朝nt_list(head);
printf("\n输入万妒打甲技频是英黑乎要删除的结点:");
scanf("%d",&z);
head=delete_node(head,z);
print_list(head);
printf("\n释放链表.\n");
}
structnode*create() //建立链表函数
{
printf("请输入各节点(以-1结尾):\n");
intx;
//定义指针*head,*tail,*s;
structnode*head,*tail,*s;
//head和tail烈演讨初始化,生成一个头结点
head=tail=(structnode*)malloc(sizeof(structnode));
//在循环委害第滑岁你中,生成新结点、赋值、连接、尾指针后移
scanf("%d国序物",&x);
while(x!=-1)
{
s=(structnode*)malloc(sizeof(structnode));
s->d蛋ata=x;
tail->next=s;
tail=s;
scanf(较员"%d",&x);
}
//尾结点的指针域赋NULL
tail->next=NULL;
returnhead;
}
voidprint_list(structnode*head) //输出链表函数
{
//定义工作指针*p并赋初值p=head->next;即指向第一个结点
structn掉右渐封听站ode*p;
p=head->next;
//判断链表是否为空,空:输出空表的信息,否则:输出所有结点
if(p==NULL)
printf("ThelistisNULL.");
else
//在循环中输出当前结点,工作指针后移
{
printf("head->");
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("end.");
}
}
structnode*insert_node(structnode*h,intx,inty) //添加结点函数
{
structnode*p,*q,*s;
//生成要插入的新结点
s=(structnode*)malloc(sizeof(structnode));
s->data=y;
q=h;
p=h->next;
//查找要插入结点的位置
while((p!=NULL)&&(p->data!=x))
{
q=p;
p=p->next;
}
//插入结点
q->next=s;s->next=p;
return(h);
}
structnode*delete_node(structnode*h,intz) //删除结点函数
{
structnode*p,*q;
q=h;
p=h->next;
//查找要删除结点的位置
if(p!=NULL)
{
while((p!=NULL)&&(p->data!=z))
{
q=p;
p=p->next;
}
//释放结点
if(p->data==z)
{
q->next=p->next;
free(p);
}
}
return(h);
}
voidshifang(structnode*head) //释放链表函数
{
structnode*p;
//逐个释放结点
while(head!=NULL)
{
p=head;
head=head->next;
free(p);
}
}