链表基础2(实现链表的逆序、将新结点插入到特定位置、边插结点边排序)

1、实现链表的逆序、将新结点插入特定位置

#include <stdio.h>

#include <stdlib.h>

#define SIZE 3

struct node
{
int num;

struct node * next;
};


typedef struct node Node;
typedef struct node * Link;


void create_link(Link * head)   //创建空链表
{
*head = NULL;
}


void insert_node_tail(Link * head,Link new_node)       //用尾插方式插入结点
{
Link p;
p = *head;

if(*head == NULL)
{
        *head = new_node;
new_node -> next = NULL;
}
    else
{
   while(p -> next != NULL)
   {
   p = p -> next;
   }
   p -> next = new_node;
   new_node ->next =  NULL;
}
}


void display_link(Link head)              //输出结点
{
if(head == NULL)
{
printf("link empty!\n");
}
else
{
while(head != NULL)
{
printf("num = %d\n",head -> num);
head = head -> next;
}
printf("\n");
}
}


void reverse(Link * head)                  //将链表逆序
{
Link p1 = *head;
Link p2 = NULL;
Link p3 = NULL;

if(*head == NULL || (*head) -> next == NULL)      //链表中没有或只有一个结点时
{
return;
}

else 
{
p2 = p1 -> next;                   //链表中只有两个结点时
if(p2 -> next == NULL)
{
*head = p2;
p2 -> next = p1;
p1 -> next = NULL;
}
   else
{
p3 = p2 -> next;        //链表中至少有三个结点时
p2 -> next = p1;

while(p3 -> next != NULL)
{
   p1 = p2;
   p2 = p3;
   p3 = p3 -> next;


   p2 -> next = p1;
}
           
   p3 -> next = p2;
(*head) -> next = NULL;
*head = p3;
}
}
}


void create_the_input_node(Link *the_input_node)     //建立要插入的结点
{
*the_input_node = (Link)malloc(sizeof(Node));


if((*the_input_node) == NULL)
{
printf("malloc error!\n");
exit(-1);
}

printf("input_num = ");
scanf("%d",&(*the_input_node) -> num);  
printf("\n");
}


void input_node(Link * head,Link the_input_node,int find_num)    //把结点插入特定位置
{
        Link p = NULL;
Link q = NULL;

p = *head;

while(p != NULL && p -> num != find_num)
{
q = p;
p = p -> next;
}
if(p == NULL)                               //链表中没有要找的num时
{
printf("can not find the num!\n");
}

else if(p == *head ||(*head) -> next == NULL)        //只有一个结点时
{
the_input_node -> next = *head;
*head = the_input_node;
}


else                                    //有一个以上结点时
{
q -> next = the_input_node;
the_input_node -> next = p;
}
}


int main()
{
Link head = NULL;
    Link new_node = NULL;
Link the_input_node = NULL;

int i;
int find_num;

create_link(&head);

printf("Please input some numbers:\n");
    for(i = 0;i < SIZE;i++)
{
   new_node = (Link)malloc(sizeof(Node));      //给新的结点分配空间
if(new_node == NULL)
{
printf("malloc error!\n");
exit(-1);
}

scanf("%d",&(new_node -> num));

insert_node_tail(&head,new_node);
}
    
display_link(head);

printf("find_num = ");
scanf("%d",&find_num);

       create_the_input_node(&the_input_node);

       input_node(&head,the_input_node,find_num);

reverse(&head);

display_link(head);
    
    return 0;

}


2、实现链表边插边排序的函数

void insert_node_sort(Link *head,Link new_node)
{
Link p = NULL;
Link q = NULL;
       p = *head;

if(*head == NULL)                  //空链表时
{
new_node -> next = NULL;
*head = new_node;
}

else
{
   while(p != NULL && p -> num < new_node -> num)            //从小到大找出第一个等于或大于new node中num的结点
   {
q = p;
   p = p -> next;
   }
if(p == *head)                          //new node作为第一个结点插入时
{
   new_node -> next = *head;
*head = new_node;
}
else if(p == NULL)                      //new node 作为最后一个结点插入时
{
q -> next = new_node;
new_node -> next = NULL;
}
else                                    //new node作为中间结点插入
{
q -> next = new_node;
new_node -> next = p;
}
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值