C++链表使用完整代码

来源:互联网 发布:青铜5 知乎 编辑:程序博客网 时间:2024/05/29 08:23

view plaincopy to clipboardprint?
  1. /* 
  2.     练习使用链表:创建链表、遍历链表、查找节点、添加节点、删除节点 
  3. */  
  4. #include "stdio.h"  
  5. #include "string.h"  
  6. #include "assert.h"  
  7. #include "stdlib.h"  
  8. #include "windows.h"  
  9. #define COUNT 3  
  10. //定义一个节点结构体  
  11. struct NODE  
  12. ...{  
  13.     unsigned long uID;  
  14.     char strName[16];  //用指针的话会出访问冲突异常  
  15.     NODE *next;  
  16. };  
  17. //创建一个具有n个节点的链表,从键盘输入数据将其初始化,并返回链表的首节点指针  
  18. NODE *createNode(int n)  
  19. ...{  
  20.     NODE *pHead, //首节点指针   
  21.          *pRear, //尾节点指针  
  22.          *pNew; //新节点指针  
  23.     int i;  
  24.     char *strName = new char[16];  
  25.     for (i=0; i<n; i++)  
  26.     ...{  
  27.         pNew = new NODE;  
  28.         do   
  29.         ...{  
  30.             printf("请输入ID和名称: ");  
  31.             scanf("%d %s",&pNew->uID, strName);      
  32.             if (strlen(strName) > 16)  
  33.             ...{  
  34.                 printf("输入名称长度超出范围,请重新输入: ");  
  35.                 Sleep(1000);  
  36.             }  
  37.         } while(strlen(strName) > 16);  
  38.         strcpy(pNew->strName, strName);  
  39.         if (0==i)  
  40.         ...{  
  41.             pRear = pHead = pNew;  
  42.         }   
  43.         else  
  44.         ...{  
  45.             pRear->next = pNew;  
  46.         }  
  47.         pNew->next = NULL;  
  48.         pRear = pNew;  
  49.     }  
  50.     delete []strName;  
  51.     return pHead;  
  52. }  
  53. //打印链表中所有节点的数据  
  54. void printNode(NODE *pHead)  
  55. ...{  
  56.     NODE *pTemp = pHead;  
  57.     assert(pTemp != NULL);  
  58.     while (pTemp != NULL)  
  59.     ...{  
  60.         printf("%d %s ",pTemp->uID, pTemp->strName);  
  61.         pTemp = pTemp->next;  
  62.     }  
  63. }  
  64. //查询链表中具有指定ID的节点,并返回此节点指针  
  65. NODE *searchNode(NODE *pHead, unsigned long uID)  
  66. ...{  
  67.     NODE *pDest = pHead;  
  68.     assert(pDest != NULL);  
  69.     while (pDest->next!=NULL && pDest->uID!=uID)  
  70.     ...{  
  71.         pDest = pDest->next;  
  72.     }  
  73.     if (pDest->uID == uID)  
  74.     ...{  
  75.         return pDest;  
  76.     }   
  77.     else  
  78.     ...{  
  79.         printf("搜索失败,未找到找定ID的节点! ");  
  80.         return NULL;  
  81.     }  
  82. }  
  83. //删除指定ID的节点  
  84. NODE *deleteNode(NODE *pHead, unsigned long uID)  
  85. ...{  
  86.     NODE *pDest, //要删除的节点  
  87.          *pBefore; //前一个节点  
  88.     pDest = pHead;  
  89.     assert(pDest != NULL);  
  90.     while (pDest->next!=NULL && pDest->uID!=uID)  
  91.     ...{  
  92.         pBefore = pDest;  
  93.         pDest = pDest->next;  
  94.     }  
  95.     if (pDest->uID == uID)  
  96.     ...{  
  97.         if (pDest == pHead)  
  98.         ...{  
  99.             pHead = pDest->next;  
  100.         }   
  101.         else  
  102.         ...{  
  103.             pBefore->next = pDest->next;  
  104.         }  
  105.         free(pDest);  
  106.         printf("节点已被删除! ");  
  107.     }   
  108.     else  
  109.     ...{  
  110.         printf("未找到指定节点,无法将其删除! ");  
  111.     }  
  112.     return pHead;  
  113. }  
  114. //在指定ID的节点后插入一个新的节点  
  115. NODE *insertNode(NODE *pHead, unsigned long uID)  
  116. ...{  
  117.     NODE *pDest, *pNew;  
  118.     pDest = pHead;  
  119.     assert(pDest != NULL);  
  120.     while(pDest->next!=NULL && pDest->uID!=uID)  
  121.     ...{  
  122.         pDest = pDest->next;  
  123.     }  
  124.     if(pDest->uID == uID)  
  125.     ...{  
  126.         pNew = new NODE;  
  127.         printf("请输入新节点的ID和名称: ");  
  128.         scanf("%d %s",&pNew->uID,pNew->strName);  
  129.         pNew->next = pDest->next;  
  130.         pDest->next = pNew;  
  131.         printf("节点插入完成! ");  
  132.     }  
  133.     else  
  134.     ...{  
  135.         printf("未找到指定节点! ");  
  136.     }  
  137.     return pHead;  
  138. }  
  139. void main()  
  140. ...{  
  141.     NODE *pHead, *pDest;  
  142.     int nSelect;  
  143.     bool isExit = false;  
  144.     unsigned long uID;  
  145.     printf("请根据提示输入数据初始化链表: ");  
  146.     pHead = createNode(COUNT);  
  147.     assert(pHead != NULL);  
  148.     printf("链表创建成功!存储数据如下: ");  
  149.     printNode(pHead);  
  150.     while (!isExit)  
  151.     ...{  
  152.         printf("-------------------------- ");  
  153.         printf("请选择要进行的操作: ");  
  154.         printf("1.打印出链表所有节点数据: ");  
  155.         printf("2.输入ID查询名称。 ");  
  156.         printf("3.删除指定ID的节点。 ");  
  157.         printf("4.在指定ID的节点后插入一个新的节点。 ");  
  158.         printf("5.退出。 ");  
  159.         printf("--------------------------- ");  
  160.         scanf("%d",&nSelect);  
  161.         switch(nSelect)  
  162.         ...{  
  163.         case 1:  
  164.             printf("链表所有节点数据如下: ");  
  165.             printNode(pHead);  
  166.             break;  
  167.         case 2:  
  168.             printf("请输入要查询的节点的ID: ");  
  169.             scanf("%d",&uID);  
  170.             pDest = searchNode(pHead, uID);  
  171.             if (pDest != NULL)  
  172.             ...{  
  173.                 printf("已找到节点,名字为:%s ",pDest->strName);  
  174.             }  
  175.             break;  
  176.         case 3:  
  177.             printf("请输入要删除的节点的ID: ");  
  178.             scanf("%d",&uID);  
  179.             pHead = deleteNode(pHead, uID);  
  180.             break;  
  181.         case 4:  
  182.             printf("请输入要删除的节点的ID: ");  
  183.             scanf("%d",&uID);  
  184.             pHead = insertNode(pHead, uID);  
  185.             break;  
  186.         case 5:  
  187.             isExit = true;  
  188.             printf("程序已退出! ");  
  189.             break;  
  190.         default:  
  191.             printf("按键错误,请重新选择! ");  
  192.             break;  
  193.         }  
  194.     }  
  195. }  

 

转载:http://blog.csdn.net/baiwujushi/archive/2010/06/04/5648252.aspx

原创粉丝点击