zoukankan      html  css  js  c++  java
  • 单链表

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <malloc.h>
      4 #include <string.h>
      5 
      6 //联系人节点结构体
      7 typedef struct _LinkNode{
      8     char name[10];  //姓名
      9     char phone[15]; //电话
     10     struct _LinkNode* next; //下一个联系人指针
     11 }LinkNode;
     12 
     13 //初始化操作
     14 LinkNode* InitList(){
     15     LinkNode* head = NULL;
     16     head = (LinkNode*)malloc(sizeof(LinkNode));
     17     if(head == NULL){
     18         printf("内存分配失败 ");
     19         return NULL;
     20     }
     21     //初始化,将其指向下一结点指针置空
     22     memset(head, 0sizeof(LinkNode));
     23     head->next = NULL;
     24 }
     25 
     26 //取元素操作,i为需要取的元素排序
     27 LinkNode* GetElem(LinkNode* ls, int i){
     28     LinkNode* temp = NULL;
     29     int j = 0;
     30     if(ls == NULL){
     31         printf("头结点不存在 ");
     32         return NULL;
     33     }
     34     if(i < 1){
     35         printf("参数输入错误 ");
     36         return NULL;
     37     }
     38     //temp指向第一个元素
     39     temp = ls->next;
     40     j = 1;
     41     //循环找到第i个元素
     42     while(temp != NULL && j < i){
     43         temp = temp->next;
     44         j++;
     45     }
     46     //第i个元素为空或者元素数量少于i
     47     if(temp == NULL || j != i){
     48         printf("元素不存在 ");
     49         return NULL;
     50     }
     51     return temp;
     52 }
     53 
     54 //插入新元素到第i个位置之前
     55 void InsertElem(LinkNode* ls, int i, LinkNode* elem){
     56     LinkNode* temp = NULL;
     57     LinkNode* newnode = NULL;
     58     int j = 0;
     59     if(ls == NULL){
     60         printf("线性表不存在 ");
     61         return ;
     62     }
     63     if(i < 1){
     64         printf("参数输入错误 ");
     65         return ;
     66     }
     67     if(elem == NULL){
     68         printf("待插入元素不存在 ");
     69         return ;
     70     }
     71     temp = ls;
     72     j = 1;
     73     //寻找第i-1个节点
     74     while(temp != NULL && j < i){
     75         temp = temp->next;
     76         j++;
     77     }
     78     if(j < i - 1){
     79         printf("第%d个元素不存在 ", i - 1);
     80         return ;
     81     }
     82     //为新节点分配内存
     83     newnode = (LinkNode*)malloc(sizeof(LinkNode));
     84     if(newnode == NULL){
     85         printf("内存分配失败 ");
     86         return ;
     87     }
     88     memcpy(newnode, elem, sizeof(LinkNode));
     89     newnode->next = temp->next;
     90     temp->next = newnode;
     91 }
     92 
     93 //销毁链表
     94 void DestroyList(LinkNode* ls){
     95     LinkNode* temp = NULL;
     96     LinkNode* next = NULL;
     97     if(ls == NULL){
     98         printf("链表不存在 ");
     99         return ;
    100     }
    101     temp = ls;
    102     while(temp != NULL){
    103          next = temp->next;
    104          free(temp);
    105          temp = next;
    106     }
    107 }
    108 
    109 //打印节点
    110 void PrintNode(LinkNode* elem){
    111     if(elem == NULL){
    112         return ;
    113     }
    114     printf("%8s %13s ", elem->name, elem->phone);
    115 }
    116 
    117 //遍历输出链表
    118 void TravList(LinkNode* ls){
    119     LinkNode* temp = NULL;
    120     if(ls == NULL){
    121         printf("链表不存在 ");
    122         return ;
    123     }
    124     temp = ls->next;
    125     while(temp != NULL){
    126         PrintNode(temp);
    127         temp = temp->next;
    128     }
    129 }
    130 
    131 //删除元素
    132 LinkNode DeleteElem(LinkNode* ls, int i){
    133     LinkNode ret = {"""", NULL};
    134     LinkNode* temp = NULL;
    135     LinkNode* del = NULL;
    136     int j = 0;
    137     if(ls == NULL){
    138         printf("链表不存在 ");
    139         return ret;
    140     }
    141     if(i < 1){
    142         printf("输入参数错误 ");
    143         return ret;
    144     }
    145     temp = ls;
    146     j = 1;
    147     while(temp != NULL && j < i){
    148         temp = temp->next;
    149         j++;
    150     }
    151     if(temp == NULL || j != i){
    152         printf("第%d个元素不存在 ", i - 1);
    153         return ret;
    154     }
    155     if(temp->next == NULL){
    156         printf("第%d个元素不存在 ", i);
    157         return ret;
    158     }
    159     //修改i-1元素的指针,指向i的下一个位置,拷贝第i个元素信息到et中,然后删除第i个元素
    160     del = temp->next;
    161     temp->next = del->next;
    162     memcpy(&ret, temp->next, sizeof(LinkNode));
    163     free(del);
    164     return ret;
    165 }
    166 
    167 //修改第i个元素
    168 void ModifyElem(LinkNode* ls, int i, LinkNode* mod){
    169     LinkNode* temp = NULL;
    170     int j = 0;
    171     if(ls == NULL || mod == NULL || i < 1){
    172         printf("参数无效 ");
    173         return ;
    174     }
    175     temp = ls->next;
    176     j = 1;
    177     while(temp != NULL && j < i){
    178         temp = temp->next;
    179         j++;
    180     }
    181     if(temp == NULL && j != i){
    182         printf("第%d个元素不存在 ", i);
    183         return ;
    184     }
    185     strcpy(temp->name, mod->name);
    186     strcpy(temp->phone, mod->phone);
    187 }
    188 
    189 int main(){
    190     LinkNode* head = NULL;
    191     int i = 0;
    192     LinkNode temp;
    193     LinkNode* result;
    194     //初始化链表
    195     head = InitList();
    196     if(head == NULL){
    197         return 1;
    198     }
    199     //链表操作
    200     for(i = 0; i < 20; i++){
    201         sprintf(temp.name, "sru%03d", i + 1);
    202         sprintf(temp.phone, "1311122%04d", i + 10);
    203         InsertElem(head, i + 1, &temp);
    204     }
    205     TravList(head);
    206     //查找操作验证, 查找元素
    207     printf(" 分别查找第1,20, 10, 21, -1个元素 ");
    208     result = GetElem(head, 1);
    209     if(result != NULL){
    210         printf("%8s %13s ", result->name, result->phone);
    211     }
    212     result = GetElem(head, 20);
    213     if(result != NULL){
    214         printf("%8s %13s ", result->name, result->phone);
    215     }
    216     result = GetElem(head, 10);
    217     if(result != NULL){
    218         printf("%8s %13s ", result->name, result->phone);
    219     }
    220     result = GetElem(head, 21);
    221     if(result != NULL){
    222         printf("%8s %13s ", result->name, result->phone);
    223     }
    224     result = GetElem(head, -1);
    225     if(result != NULL){
    226         printf("%8s %13s ", result->name, result->phone);
    227     }
    228 
    229     //删除元素验证
    230     printf(" 删除元素验证 ");
    231     DeleteElem(head, 1);
    232     DeleteElem(head, 10);
    233     DeleteElem(head, 20);
    234     DeleteElem(head, 21);
    235 
    236     TravList(head);
    237 
    238     //修改元素验证
    239     printf(" 修改元素验证 ");
    240     strcpy(temp.name, "mod");
    241     strcpy(temp.phone, "123");
    242     ModifyElem(head, 0, &temp);
    243     ModifyElem(head, 1, &temp);
    244     ModifyElem(head, 10, &temp);
    245     ModifyElem(head, 18, &temp);
    246     ModifyElem(head, 21, &temp);
    247 
    248     TravList(head);
    249 
    250     //销毁链表
    251     DestroyList(head);
    252     return 0;
    253 }
    254 
    255 /*
    256   sru001          13111220010
    257   sru002          13111220011
    258   sru003          13111220012
    259   sru004          13111220013
    260   sru005          13111220014
    261   sru006          13111220015
    262   sru007          13111220016
    263   sru008          13111220017
    264   sru009          13111220018
    265   sru010          13111220019
    266   sru011          13111220020
    267   sru012          13111220021
    268   sru013          13111220022
    269   sru014          13111220023
    270   sru015          13111220024
    271   sru016          13111220025
    272   sru017          13111220026
    273   sru018          13111220027
    274   sru019          13111220028
    275   sru020          13111220029
    276 
    277 分别查找第1,20, 10, 21, -1个元素
    278   sru001          13111220010
    279   sru020          13111220029
    280   sru010          13111220019
    281 元素不存在
    282 参数输入错误
    283 
    284 删除元素验证
    285 第19个元素不存在
    286 第20个元素不存在
    287   sru002          13111220011
    288   sru003          13111220012
    289   sru004          13111220013
    290   sru005          13111220014
    291   sru006          13111220015
    292   sru007          13111220016
    293   sru008          13111220017
    294   sru009          13111220018
    295   sru010          13111220019
    296   sru012          13111220021
    297   sru013          13111220022
    298   sru014          13111220023
    299   sru015          13111220024
    300   sru016          13111220025
    301   sru017          13111220026
    302   sru018          13111220027
    303   sru019          13111220028
    304   sru020          13111220029
    305 
    306 修改元素验证
    307 参数无效
    308 第21个元素不存在
    309      mod                  123
    310   sru003          13111220012
    311   sru004          13111220013
    312   sru005          13111220014
    313   sru006          13111220015
    314   sru007          13111220016
    315   sru008          13111220017
    316   sru009          13111220018
    317   sru010          13111220019
    318      mod                  123
    319   sru013          13111220022
    320   sru014          13111220023
    321   sru015          13111220024
    322   sru016          13111220025
    323   sru017          13111220026
    324   sru018          13111220027
    325   sru019          13111220028
    326      mod                  123
    327 
    328 Process returned 0 (0x0)   execution time : 0.140 s
    329 Press any key to continue.
    330 
    331 */
  • 相关阅读:
    bash 笔记
    lvs: linux virtual server
    学习html第一天
    学习c语言的第14天
    c语言学习的第13天2
    c语言学习的第13天1
    c语言学习的第12天
    c语言学习的第11天 指针
    移动端点击延迟300毫秒----FastClick用法
    H5移动端复制功能实现
  • 原文地址:https://www.cnblogs.com/angle-qqs/p/4025260.html
Copyright © 2011-2022 走看看