单链表的删除

Description

建立一个长度为n的单链表,删除链表中所有数据元素为x的结点。(数据类型为整型)

Input

第一行为链表的长度n

第二行为链表中的数据元素;

第三行为要删除的数据元素x的值。

Output

删除数据x后,单链表中的数据元素

Sample Input

10
1 2 3 4 5 6 7 8 9 10
5

Sample Output

 1 2 3 4 6 7 8 9 10

#include <stdio.h>
#include <malloc.h>
////定义单链表结构体,包括一个数据域和一个指针域
typedef struct link_node_s{
        int data;
        struct link_node_s *next;
                
} link_node_t,*link_list_t;

//创建单链表
link_list_t create_linklist(int n)
{
            int i;
            link_node_t *head ,*head_p,*new_node;
            //printf("线性表的长度..\n");
            //申请一个头结点的空间
            head = (link_list_t) malloc(sizeof(link_node_t));
            head->next=NULL;//头指针为空
            head_p = head;//头指针不变化
            for(i=1;i<n;i++)
            {
             new_node =(link_list_t) malloc(sizeof(link_node_t));
             scanf("%d ",&new_node->data);
             new_node->next=NULL;//新插入的结点指针域为空
             head_p->next=new_node;//所指结点与新插入的结点new链接
             head_p = new_node;//p所指向的位置是最后一个节点 
             if(i==n)
             break;
            } 
            //最后一个数
             new_node =(link_list_t) malloc(sizeof(link_node_t));
             scanf("%d",&new_node->data);
             new_node->next=NULL;
             head_p->next=new_node;
             head_p = new_node;//p所指向的位置是最后一个节点 
  
            return head;
} 
//查找链表指定的位置
int search_list(link_list_t L,int i)
{
     int j=0;
     link_list_t link_p;
     link_p = L;
      while(link_p->next!=NULL && j<i)//查找i个元  
      {
      link_p=link_p->next;
      j++;         
      } 
      if(j == i)
          {
              
               return 1;
          }
          else{return 0;}
} 
//插入链表指定位置
//后插操作的时间复杂度为O(1),
//设link_p指向单链表中某节点,new_node指向待插入的值为x的新节点,将*new_node插入到*link_p的后面。
int inser_list(link_list_t L,int i,int data)
{
     link_list_t link_p,new_node;
     int j=0;
     link_p = L;
     new_node =(link_list_t) malloc(sizeof(link_node_t));
     new_node->data = data;
      while(link_p->next!=NULL && j<i)//查找i个元  
      {
      link_p=link_p->next;
      j++;         
      } 
        if(j == i)
          {
               new_node->next = link_p->next;
               link_p->next =new_node;
               return 1;
          }
          else{return 0;}
          
}

//指定 除单链表中某个数据,并统计 除此数据的个数
int Delete_2(link_list_t head, int Delete_data)
{
 int count = 0;
 link_list_t p = head, q;
 while(NULL != p->next)
 {
  q = p->next;
  if(q->data == Delete_data)
  {
   p->next = q->next;
   free(q);
   ++count;
  }
  else
  {
   p = q;
  }
 }
 return count;
}
// 除第i个结点,或者说是第i个元 
int delet_list(link_list_t L,int i)
{
    link_list_t link_p,link_q;
    int j =00;
    link_p = L;//从头结点开始查找
    //如果 除第一个节点 
    if(i == 1)
      {
            link_q=link_p->next;
            link_p->next=link_q->next;
            free(link_q);
            return 1;
      }
      
    while(link_p->next!=NULL && j<i-1)//查找i-1个元  
    {
    link_p=link_p->next;
    j++;
        if(j == i-1)
         {
         //p指向第i-1个元 ,q指向第i个元 , 除q
         link_q=link_p->next;
         link_p->next=link_q->next;
         free(link_q);
         return 1;
          
         }
         else{return 0;}
    }    
}
void print_link(link_list_t L,int len)
{
 link_list_t link_p;
 link_p=L->next;
 while(link_p!=NULL)
 {
  len--;
  if(len == 0)
  printf("%d",link_p->data);
  else
  printf("%d ",link_p->data);
  link_p=link_p->next;
 }
}
int main()
{
 link_list_t L;
 int i,n=0,insert,insert_s,deletdata,len=0;
 scanf("%d",&n);
 len = n;
 L=create_linklist(n);
 //print_link(L,len);
 //printf("\n");
 //插入的元 
 scanf("%d",&deletdata);

 insert_s = Delete_2(L,deletdata);
 //len++;//长度 上插入的 
 //scanf("%d",&indata);
 //insert_s=search_list(L,insert);
 //insert_s=inser_list(L,insert-1,indata);
 //delet_s = delet_list(L,delet-1);//插入节点i节点前的一个 
  if(insert_s !=0)
  print_link(L,len-insert_s);
  //printf("%d",insert_s);
  else
  printf("error!");
  while(1);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值