zoukankan      html  css  js  c++  java
  • 单向链表完整代码

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<time.h>
      4 #include<math.h>
      5 typedef struct node
      6 {
      7     int data;
      8     struct node * next;
      9 }linkNode;
     10 typedef linkNode *pLinkNode;
     11 
     12 void creatLinkByHeadInsert(pLinkNode &head,int n);//生成n个随机数,用头插法构造链表
     13 void creatLinkByTailInsert(pLinkNode &head,int n);//生成n个随机数,用尾插法构造链表
     14 void printLink(pLinkNode head);//输出链表的结点值 
     15 void delLink(pLinkNode &head);//释放整条链的所有结点
     16 void delLinkNode(pLinkNode &head,int k);//删除并释放链表的第k个结点 
     17 void delLinkNodeByVal(pLinkNode &head,int k);//删除链表中所有值为k的结点 
     18 void insertNode(pLinkNode &head,int data,int k);//用data构造一个结点并插入链表,使其成为链表的第k个结点(若链表节点数小于k-1则插入到链表末尾) 
     19 
     20 int main()
     21 {
     22     pLinkNode head;
     23     int valToDel,valToInsert;
     24     
     25     /*
     26     head=NULL;
     27     creatLinkByHeadInsert(head,10);
     28     printLink(head);
     29     delLinkNode(head,1);
     30     printLink(head);
     31     delLinkNode(head,2);
     32     printLink(head);
     33     delLink(head);
     34     if(head==NULL)
     35         printf("链表所有结点释放成功.
    ");
     36     else
     37         printf("在释放链表所有结点时发生未知错误,未能成功释放链表所有结点。
    ");
     38     */
     39     
     40     
     41     
     42     printf("
    
    ");
     43     head=NULL;
     44     creatLinkByTailInsert(head,10);
     45     printLink(head);
     46     
     47     printf("输入一个想要删除的数:");
     48     scanf("%d",&valToDel);
     49     delLinkNodeByVal(head,valToDel);
     50     printLink(head);
     51     
     52     printf("输入一个想要插入的数:");
     53     scanf("%d",&valToInsert);
     54     insertNode(head,valToInsert,1);
     55     insertNode(head,valToInsert,3);
     56     insertNode(head,valToInsert,12);
     57     printf("插入第1和第3,12个位置后的序列为:
    ");
     58     printLink(head);
     59     
     60     delLink(head);
     61     if(head==NULL)
     62         printf("链表所有结点释放成功.
    ");
     63     else
     64         printf("在释放链表所有结点时发生未知错误,未能成功释放链表所有结点。
    ");
     65 
     66     return 0;
     67 }
     68 
     69 //生成n个随机数,用头插法构造链表
     70 void creatLinkByHeadInsert(pLinkNode &head,int n)
     71 {
     72     int i;
     73     pLinkNode p;
     74     head=NULL;
     75     
     76     srand((unsigned)time(0));
     77     for(i=0;i<n;i++)
     78     {
     79         p=(pLinkNode)malloc(sizeof(linkNode));
     80         p->data=rand()%100+10;
     81         p->next=NULL;
     82         printf("%d ",p->data);
     83         
     84         if(head==NULL)
     85         {
     86             head=p;
     87         }
     88         else
     89         {
     90             p->next=head;
     91             head=p;
     92         }
     93     }
     94     printf("
    ");
     95 }
     96 
     97 //输出链表的结点值 
     98 void printLink(pLinkNode head)
     99 {
    100     pLinkNode p;
    101     p=head;
    102     while(p!=NULL)
    103     {
    104         printf("%d ",p->data);
    105         p=p->next;
    106     }
    107     printf("
    ");
    108 }
    109 
    110 //生成n个随机数,用尾插法构造链表
    111 void creatLinkByTailInsert(pLinkNode &head,int n)
    112 {
    113     pLinkNode end,p;
    114     int i;
    115     
    116     head=NULL;
    117     end=NULL;
    118     
    119     srand((unsigned)time(0));
    120     for(i=0;i<n;i++)
    121     {
    122         p=(pLinkNode)malloc(sizeof(linkNode));
    123         p->data=rand()%100+10;
    124         p->next=NULL;
    125         printf("%d ",p->data);
    126         
    127         if(head==NULL)
    128         {
    129             head=p;
    130             end=p;
    131         }
    132         else
    133         {
    134             end->next=p;
    135             end=p;
    136         }
    137     }
    138     printf("
    ");
    139 }
    140 
    141 //释放整条链的所有结点
    142 void delLink(pLinkNode &head)
    143 {
    144     pLinkNode p,q;
    145     p=head;
    146     
    147     while(p!=NULL)
    148     {
    149         q=p->next;
    150         free(p);
    151         p=q;
    152     }
    153     head=NULL;
    154 }
    155 
    156 //删除并释放链表的第k个结点 
    157 void delLinkNode(pLinkNode &head,int k)
    158 {
    159     pLinkNode p,q;
    160     int i;
    161     
    162     if(k==1)
    163     {
    164         p=head;
    165         head=head->next;
    166         free(p);
    167     }
    168     else
    169     {
    170         q=head;
    171         p=head->next;
    172         i=2;
    173         while(p!=NULL&&i<k)
    174         {
    175             q=p;
    176             p=p->next;
    177             i++;
    178         }
    179         if(p==NULL)
    180             return;
    181         else
    182         {
    183             q->next=p->next;
    184             free(p);
    185         }
    186     }
    187 }
    188 
    189 //删除链表中所有值为k的结点 
    190 void delLinkNodeByVal(pLinkNode &head,int k)
    191 {
    192     pLinkNode p,q;
    193     while(head->data==k)
    194     {
    195         p=head;
    196         head=head->next;
    197         free(p);
    198     }
    199     
    200     p=head->next;
    201     q=head;
    202     while(p!=NULL)
    203     {
    204         if(p->data==k)
    205         {
    206             q->next=p->next;
    207             free(p);
    208             p=q->next;
    209         }
    210         else
    211         {
    212             q=p;
    213             p=p->next;
    214         }
    215     }
    216 }
    217 
    218 //用data构造一个结点并插入链表,使其成为链表的第k个结点(若链表节点数小于k-1则插入到链表末尾) 
    219 void insertNode(pLinkNode &head,int data,int k)
    220 {
    221     pLinkNode p,q;
    222     int i;
    223     
    224     p=(pLinkNode)malloc(sizeof(linkNode));
    225     p->data=data;
    226     p->next=NULL;
    227     
    228     if(k==1)
    229     {
    230         p->next=head;
    231         head=p;
    232     }
    233     else
    234     {
    235         q=head;
    236         for(i=2;i<k&&q!=NULL;i++)
    237         {
    238             q=q->next;
    239         }
    240         if(q==NULL)
    241         {
    242             q->next=p;
    243         }
    244         else
    245         {
    246             p->next=q->next;
    247             q->next=p;
    248         }
    249     }
    250 }
  • 相关阅读:
    mysql获取插入时自增ID值的方法
    percona-toolkit介绍及安装
    mysql如何修改所有的definer
    Mysql数据库安全管理配置
    mysql update时报错You are using safe update mode
    mysql修改definer方法
    mysqldump: Couldn't execute 'show table status '解决方法
    Linux下修改PATH路径
    mysql 查看当前登陆用户匹配原则及权限user()与current_user()
    ASP.NET MVC post请求接收参数的三种方式
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/6665365.html
Copyright © 2011-2022 走看看