单链表的操作
1.creat_list(LIST L)
2 insert(LIST *L)
3 Delete_K(LIST *L)
4 print_list(LIST L)
#include<stdio.h>
#include<stdlib.h>
typedef struct List //定义结构体struct List
{
int data; //定义整型数据data
struct List *next; //定义后继节点地址
}*LIST; //为指针结构体取别名
LIST creat_list(LIST L) //函数作用为创建一个链表,并输入信息
{
LIST p,q; //定义指针节点p,q
int i,n; //定义节点个数n
printf("请输入创建的单链表的节点数\n");
scanf("%d",&n); //输入总节点数n
L=(LIST)malloc(sizeof(LIST)); //为L头节点分配空间
L->next=NULL; //后继置空
p=L; //将头节点赋给p
printf("请输入各节点的值\n");
for(i=0;i<n;i++)
{
q=(LIST)malloc(sizeof(LIST)); //生成新的节点
scanf("%d",&q->data); //为新节点输入数据
q->next=NULL; //将新节点后继置空
p->next=q; //把新结点接到p的后继
p=q; //更新节点p
}
return L; //返回头节点L
}
LIST print_list(LIST L) //打印输出一个节点
{
printf("输出打印节点如下:\n");
LIST p;
int count=0; //为后面输出换行所用
for(p=L->next;p!=NULL;p=p->next)
{
printf("%4d",p->data); //输出节点信息
count++;
if(count%5==0) //每输出5个节点信息就换行一次
printf("\n");
}
printf("\n");
}
void insert(LIST *L) //在第一次x出现后插入节点数据为y
{
LIST p,q,Q; //定义结构体指针变量
int x,y; //定义节点数据x,y
q=(LIST)malloc(sizeof(LIST)); //分配空间
printf("请输入x和y的值 ");
scanf("%d%d",&x,&y); //输入x,y的值
q->data=y,q->next=NULL; //将y的值赋给q->data
p=(*L)->next; //将第一个有数据的节点赋给q
while(p&&p->data!=x) //查找数据等于x的节点
{
Q=p; //保存q节点
p=p->next;
}
if(p) //判断p是否遍历完链表
{
q->next=p->next;
p->next=q;
}
else //如果没有找到等于x的节点就插在最后面
{
Q->next=q;
}
}
void Delete_K(LIST *L) //删除节点信息等于k的节点
{
LIST p;
int k,count=0; //count计算节点等于k的节点
printf("请输入要删除的节点值k\n");
scanf("%d",&k); //输入k等于要删除的节点data
for(p=*L;p!=NULL;p=p->next) //遍历链表
{
while((p->next)&&p->next->data==k)//判断是否有存在data连续等于k的节点
{
p->next=p->next->next;
count++; //计算k的数目
}
}
printf("总共删除了%d个等于k值得节点\n",count);
}
int main()
{
LIST h; //定义头指针
h=NULL; //置空
h=creat_list(h); //调用创建链表函数并返回头节点
print_list(h); //打印输出创建的节点
insert(&h); //调用插入y的函数
printf("在x的值第一次出现后插入节点值为y后的链表\n");
print_list(h); //打印输出插入的链表的信息
Delete_K(&h); //调用删除节点值等于k的函数
printf("删除节点后的节点信息如下\n");
print_list(h); //打印输出删除后的节点
}