单链表的插入操作的实现---后插法…

来源:互联网 发布:mac系统官方下载地址 编辑:程序博客网 时间:2024/06/11 02:36

单链表的插入操作的实现

Description

建立长度为n的单链表,在第i个结点之前插入数据元素data

Input
Output

第一行为自然数n,表示链式线性表的长度;
第二行为n个自然数表示链式线性表各元素值;
第三行为指定插入的位置i;
第四行为待插入数据元素data。

Sample Input

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

Sample Output

51 2 3 4 536
Hint

1 2 6 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)
{
           inti;
          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所指向的位置是最后一个节点 
  
           returnhead;
//插入链表指定位置
//后插操作的时间复杂度为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;
     intj=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;}
     
}
//删除第i个结点,或者说是第i个元素
int delet_list(link_list_t L,int i)
{
    link_list_tlink_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);
           return1;
     }
     
   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;
 inti,n=0,insert,insert_s,indata,len=0;
 scanf("%d",&n);
 len = n;
 L=create_linklist(n);
 //print_link(L,len);
 //printf("\n");
 //插入的元素
 scanf("%d",&insert);
 len++;//长度加上插入的 
 scanf("%d",&indata);
 insert_s=inser_list(L,insert-1,indata);
 //delet_s =delet_list(L,delet-1);//插入节点i节点前的一个 
  if(insert_s == 1)
  print_link(L,len);
  else
  printf("error!");
  
}

 
0 0
原创粉丝点击