Chinaunix首页 | 论坛 | 博客
  • 博客访问: 177071
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 346
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-04 00:06
文章分类

全部博文(38)

文章存档

2016年(3)

2015年(15)

2014年(16)

2013年(4)

我的朋友

分类: LINUX

2014-03-14 21:26:07


    今天面试遇到了链表逆序的问题,当时笔试还写错了一点,以此纠正自己,好好学习。

    逆置实现:
    点击(此处)折叠或打开
  1. LinkList reverse(LinkList head)
  2. {
  3.     LinkList p = head->next;
  4.         
  5.     LinkList q = p->next;               //p为新头结点
  6.     head->next = NULL;                  //头结点无数据,断开头结点,其他节点头插法插入

  7.         while(p)                        //遍历查找
  8.         {        
  9.         
  10.         p->next = head->next;
  11.         head->next = p;
  12.         
  13.        if(q)                           //判断q不为空
  14.         {
  15.             p = q;
  16.             q = p->next;
  17.         }
  18.         else
  19.             break;
  20.         }
  21.     
  22.     return head;
  23. }

    

链表操作:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. typedef int DataType;

  5. typedef struct node
  6. {
  7.     DataType data;
  8.     struct node *next;
  9. }LinkNode, *LinkList;

  10. LinkList create_empty_linklist();
  11. LinkList reverse(LinkList head);                         //链表逆序
  12. int insert_order_linklist(LinkList head,DataType data);  //有序插入
  13. LinkList sorted_merge(LinkList a,LinkList b);            //链表合并
  14. int insert_head_linklist(LinkList head,DataType data);   //头插法
  15. int insert_tail_linklist(LinkList head,DataType data);   //尾插法
  16. int print_linklist(LinkList head);                       //链表输出
  17. int delete_assign_node(LinkList head,DataType data);     //删除指定元素

  18. int main()
  19. {
  20.    LinkList head = NULL,head2 = NULL,head3 = NULL;
  21.    int i = 0;

  22.    head = create_empty_linklist();

  23.    for(i = 0; i < 10; i++)
  24.    {
  25.         insert_head_linklist(head,i);
  26.      // insert_tail_linklist(head,i);
  27.    }
  28.     print_linklist(head);

  29.     delete_assign_node(head,7);
  30.     print_linklist(head);

  31.     reverse(head);
  32.     print_linklist(head);

  33.     insert_order_linklist(head,7);
  34.     print_linklist(head);

  35.     head2 = create_empty_linklist();
  36.     {
  37.         insert_head_linklist(head2,23);
  38.         insert_head_linklist(head2,7);
  39.         insert_head_linklist(head2,4);
  40.     }
  41.     print_linklist(head2);

  42.     head3 = create_empty_linklist();
  43.     {
  44.         insert_head_linklist(head3,12);
  45.         insert_head_linklist(head3,8);
  46.         insert_head_linklist(head3,5);
  47.     }
  48.     print_linklist(head3);    

  49.     LinkList res = sorted_merge(head2,head3);
  50.     print_linklist(res);

  51.    exit(0);
  52. }
  53.     
  54. LinkList create_empty_linklist()
  55. {
  56.      LinkList head = NULL; //声明空结点

  57.      head = (LinkList)malloc(sizeof(LinkNode));
  58.      
  59.      head->next = NULL; //头结点指针域为空

  60.      return head ;
  61. }

  62. LinkList reverse(LinkList head)
  63. {
  64.     LinkList p = head->next;
  65.     LinkList q = p->next; //分离出新的链表p                 
  66.     head->next = NULL;          //断开头结点,头结点无数据,依次头插法插入到head中,实现逆置。

  67.     while(p)
  68.     {
  69.         p->next = head->next;
  70.         head->next = p;      //头插法插入结点

  71.         if(q)
  72.         {
  73.             p = q;
  74.             q = q->next;
  75.         }
  76.         else
  77.             break;
  78.     }
  79.     
  80.     return head;
  81. }

  82. LinkList sorted_merge (LinkList a, LinkList b)
  83. {
  84.     LinkList result = NULL;
  85. #if 1    
  86.     if(a == NULL)
  87.         return b;
  88.     else if(b == NULL)
  89.         return a;
  90. #endif
  91.     if(a->data <= b->data)
  92.     {
  93.         result = a;
  94.         result->next = sorted_merge(a->next,b);
  95.     }

  96.     else
  97.     {
  98.         result = b;
  99.         result->next = sorted_merge(a,b->next);
  100.     }

  101.     return result;
  102. }

  103. int insert_head_linklist(LinkList head,DataType data)
  104. {
  105.     struct node *temp = NULL;
  106.     temp = (struct node *)malloc(sizeof(struct node));
  107.         
  108.     temp->data = data;
  109.     temp->next = head->next; //后继
  110.     head->next = temp; //前驱

  111.     return 0;
  112. }


  113. int insert_tail_linklist(LinkList head,DataType data)
  114. {
  115.     struct node *temp = NULL;
  116.     temp = (struct node*)malloc(sizeof(struct node));
  117.     
  118.     LinkList p = head;
  119.     while(p->next) //遍历到链表尾部插入结点
  120.     {
  121.         p = p->next;
  122.     }

  123.     temp->data = data;
  124.     temp->next = NULL;
  125.     p->next = temp;
  126.          

  127.     return 0;
  128. }

  129. int insert_order_linklist(LinkList head,DataType data)
  130. {
  131.     struct node *temp =NULL;
  132.     temp = (struct node *)malloc(sizeof(struct node));

  133.     LinkList p = head;
  134. #if 0    
  135.     while(p->next)
  136.     {
  137.         
  138.         if(data < p->next->data)
  139.         {
  140.             break;
  141.         }
  142.         p = p->next;
  143.     }
  144. #endif
  145.     while(p->next && data>p->next->data)
  146.     {
  147.         p = p->next;
  148.     }
  149.         temp->data = data;
  150.         temp->next = p->next;
  151.         p->next = temp;

  152.         return 0;
  153. }

  154. int delete_assign_node(LinkList head,DataType data) //删除指定元素节点
  155. {
  156.     LinkList temp = NULL;
  157.     LinkList p = head;

  158.     while(p->next)
  159.     {
  160.         if(p->next->data == data)
  161.         {
  162.             break ;
  163.         }
  164.         p = p->next;
  165.     }
  166.     
  167.     if(p->next == NULL) //说明节点不存在
  168.     {
  169.         return -1;
  170.     }

  171.     temp = p->next;
  172.     p->next = temp->next;

  173.     free(temp);

  174.     return 0;
  175. }

  176. int print_linklist(LinkList head)
  177. {
  178.      LinkList p = head->next; //遍历链表

  179.     while(p)
  180.     {
  181.         printf("%d ",p->data);
  182.         p = p->next;
  183.     }

  184.     putchar('\n');
  185.     
  186.     return 0;
  187. }

运行结果:
    


阅读(1494) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~