您的位置:首页 > 其它

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

2017-02-09 23:43 399 查看
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 作为最后一个
9b43
结点插入时
{
q -> next = new_node;
new_node -> next = NULL;
}
else                                    //new node作为中间结点插入
{
q -> next = new_node;
new_node -> next = p;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐