zoukankan      html  css  js  c++  java
  • 同时创建两条单链表,头插法插入节点,遍历,查找,删除,求长度,冒泡排序,反转,2条有序链表链接成一条链表后依然有序

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 /*
      4 链表每日一练:创建2条空链表,头插法插入节点,遍历,查找,删除,求长度,冒泡排序,反转,2条有序链表链接成一条链表后依然有序。
      5 */
      6 typedef struct node
      7 {
      8     int data;
      9     struct node * next;
     10 }NODE;
     11 //创建空链表
     12 NODE * createList()
     13 {
     14     NODE * head = (NODE *)malloc(sizeof(NODE));
     15     head->next = NULL;
     16 
     17     return head;
     18 }
     19 //头插法插入节点
     20 void insertNode(NODE *head,int insertData)
     21 {
     22     NODE *sur = (NODE *)malloc(sizeof(NODE));
     23     sur->data = insertData;
     24 
     25     sur->next = head->next;
     26     head->next = sur;
     27 }
     28 //遍历
     29 void traverList(NODE *head)
     30 {
     31     head = head->next;
     32     while(head)
     33     {
     34         printf("%d
    ",head->data);
     35         head = head->next;
     36     }
     37 }
     38 //查找
     39 NODE * lookNode(NODE *head,int lookData)
     40 {
     41     head = head->next;
     42     while(head)
     43     {
     44         if(head->data == lookData)
     45             break;
     46         else
     47             head = head->next;
     48     }
     49     return head;
     50 }
     51 //删除
     52 void deleteNode(NODE *head,NODE *p)
     53 {
     54     while(head->next != p)
     55         head = head->next;
     56     head->next = p->next;
     57     free(p);
     58 }
     59 //求长度
     60 int lenList(NODE * head)
     61 {
     62     int len = 0;
     63     head = head->next;
     64     while(head)
     65     {
     66         len++;
     67         head = head->next;
     68     }
     69 
     70     return len;
     71 }
     72 //冒泡排序
     73 void Popsort(NODE *head,int len)
     74 {
     75     int i,j;
     76     NODE * sur = NULL;
     77     NODE *p,*q,*temp;
     78     p = q = temp = NULL;
     79     for(i = 0;i<len-1;i++)
     80     {
     81         sur = head;
     82         p = sur->next;
     83         q = p->next;
     84         for(j = 0;j<len-i-1;j++)
     85         {
     86             if(p->data > q->data)
     87             {
     88                 sur->next = q;
     89                 p->next = q->next;
     90                 q->next = p;
     91 
     92                 temp = q;
     93                 q = p;
     94                 p = temp;
     95             }
     96             sur = sur->next;
     97             p = p->next;
     98             q = q->next;
     99         }
    100     }
    101 }
    102 //链表反转,分2步:1,先将原有链表分成2个链表,一个是空链表,一个是无头结点的链表
    103 //                   2.然后将无节点的链表逐个插入至空链表中
    104 //步骤1:差分链表
    105 NODE *breakList(NODE *head)
    106 {
    107     NODE * p = head->next;
    108     head->next = NULL;
    109 
    110     return p;
    111 }
    112 //插入
    113 void ReverList(NODE *head,NODE *p)
    114 {
    115     while(p)
    116     {
    117         NODE * q = p->next;
    118         p->next = head->next;
    119         head->next = p;
    120         p = q;
    121     }    
    122 }
    123 //合并链表,合并后使之仍然有序
    124 NODE * mergeList(NODE *head1,NODE *head2)
    125 {
    126     NODE * sur = createList();
    127     head1 = head1->next;
    128     head2 = head2->next;
    129     while(head1&&head2)
    130     {
    131         if(head1->data >= head2->data)//特别注意这一点:链表头插法从小到大输出,实际上插入结点的时候,是先把最大的插进链表
    132                                       //最后吧最小的插进链表。和数组正好是反的。即:数组从前往后放,头插链表从后往前放。
    133         {
    134             insertNode(sur,head1->data);
    135             head1 = head1->next;
    136         }
    137         else
    138         {    
    139             insertNode(sur,head2->data);
    140             head2 = head2->next;
    141         }
    142     }
    143     if(NULL == head1)
    144     {
    145         while(head2)
    146         {
    147             insertNode(sur,head2->data);
    148             head2 = head2->next;
    149         }
    150     }
    151     else
    152     {
    153         while(head1)
    154         {
    155             insertNode(sur,head1->data);
    156             head1 = head1->next;
    157         }
    158     }
    159     return sur;
    160 }    
    161 int main(void)
    162 {
    163     //创建2条空链表
    164     NODE * head1 = createList();
    165     NODE * head2 = createList();
    166     //头插法插入节点
    167     for(int i = 0;i<50;i++)
    168         insertNode(head1,rand()%100);
    169     for(i = 1;i<60;i += 2)
    170         insertNode(head2,i);
    171     //遍历链表
    172     traverList(head1);
    173     printf("-------链表2------------
    ");
    174     traverList(head2);
    175     printf("------查找99这个结点---------
    ");
    176     //链表查找,如果找到返回该结点指针,否则返回NULL
    177     NODE * plook1 = lookNode(head1,99);
    178     NODE * plook2 = lookNode(head2,99);
    179     //执行删除操作
    180     if(plook1)
    181         deleteNode(head1,plook1);
    182     if(plook2)
    183         deleteNode(head2,plook2);
    184     printf("------删除后链表-------1
    ");
    185     traverList(head1);
    186     printf("------------删除后链表2----------
    ");
    187     traverList(head2);
    188     //链表冒泡排序
    189     printf("-----------链表排序--------
    ");
    190     int len1 = lenList(head1);
    191     int len2 = lenList(head2);
    192     Popsort(head1,len1);
    193     Popsort(head2,len2);
    194     printf("-------链表1------------
    ");
    195     traverList(head1);
    196     printf("-------链表2------------
    ");
    197     traverList(head2);
    198     printf("------链表1反转-------
    ");
    199     NODE *Newhead1 = breakList(head1);
    200     NODE *Newhead2 = breakList(head2);
    201     ReverList(head1,Newhead1);
    202     traverList(head1);
    203     printf("------链表2反转-------
    ");
    204     ReverList(head2,Newhead2);
    205     traverList(head2);
    206     printf("------合并2条有序的链表,使之合并后仍然有序-------
    ");
    207     traverList(mergeList(head1,head2));
    208 
    209     return 0;
    210 }
  • 相关阅读:
    Linux mii-tool 命令
    MySQL 主从复制
    MySQL 备份与恢复
    SOAP 版本可能不匹配: 出现意外的 Envelope 命名空间 http://schemas.xmlsoap.org/wsdl/
    网管邮件配置
    ORA-10873
    Exception in thread "main" java.lang.UnsatisfiedLinkError:
    安装 ORACLE 11G出现Error Message:PRVF-7535
    mount /dev/sr0 /media/cdrom you must specify the filesystem type
    NBU 还原windows ORACLE数据库(BW)
  • 原文地址:https://www.cnblogs.com/wangchaomahan/p/9744878.html
Copyright © 2011-2022 走看看