单链表的删除操作的实现

Description

建立长度为n的单链表,删除第i个结点之前的结点。

Input

第一行为自然数n,表示链式线性表的长度;

第二行为n个自然数表示链式线性表各元素值;

第三行为指定的删除参数i

Output

指定删除位置合法时候,输出删除元素后的链式线性表的所有元素,元素之间用一个空格隔开。输入不合法,输出“error!”。

Sample Input

5
1 2 3 4 5
3

Sample Output

1 3 4 5


#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;
//删除第i个结点,或者说是第i个元素
int delet_list(link_list_t L,int i)
{
    link_list_t link_p,link_q,link_tmp;
    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,delet,delet_s,len=0;
  scanf("%d",&n);
  len = n;
  L=create_linklist(n);
  //print_link(L,len);
  //printf("\n");
  //删除的元素
  scanf("%d",&delet);
  len--;//减去删除的 
  delet_s = delet_list(L,delet-1);//删除i节点前的一个 
  if(delet_s == 1)
  print_link(L,len);
  else
  printf("error!");
}

<script type="text/javascript" id="wumiiRelatedItems"> </script>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值