单链表的常用(创建,插入,删除,打印)操作c语言

单链表的操作
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);                         //打印输出删除后的节点 
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值