1. #include <cstdio>
    2. #include <cstdlib>
    3. #include <iostream>
    4. using namespace std;
    5. typedef struct _NPC{
    6. char name[20];
    7. int attack;
    8. int hp;
    9. }NPC;
    10. typedef struct _node{
    11. NPC data;
    12. struct _node *pNext;
    13. }Node;
    14. Node *head = NULL;//定义一个头节点
    15. //添加节点
    16. void addNode(){
    17. if (head == NULL) {
    18. //head申请一个内存空间
    19. head = (Node*)malloc(sizeof(Node));
    20. printf("请输入NPC的名字 攻击力 生命值:\n");
    21. scanf("%s %d %d",head->data.name,&head->data.attack,&head->data.hp);
    22. head->pNext=NULL;
    23. } else {
    24. Node *p = head;//指向头节点
    25. while (p->pNext != NULL) {
    26. p = p->pNext;
    27. }
    28. //申请内存空间
    29. p->pNext = (Node*)malloc(sizeof(Node));
    30. p = p->pNext;
    31. printf("请输入NPC的名字 攻击力 生命值:\n");
    32. scanf("%s %d %d",p->data.name,&p->data.attack,&p->data.hp);
    33. p->pNext = NULL;
    34. }
    35. printf("添加节点成功!\n");
    36. }
    37. //输出所有节点
    38. void printAllNode(){
    39. Node *q = head;//指向头节点
    40. while (q!=NULL) {
    41. printf("名字为:%s,攻击力:%d,生命值:%d\n",q->data.name,q->data.attack,q->data.hp);
    42. q=q->pNext;
    43. }
    44. printf("输出所有节点成功!\n");
    45. }
    46. //插入节点
    47. void insertNode(){
    48. //创建一个新的节点
    49. Node *newNode = (Node*)malloc(sizeof(Node));
    50. printf("请输入NPC的名字 攻击力 生命值:\n");
    51. scanf("%s %d %d",newNode->data.name,&newNode->data.attack,&newNode->data.hp);
    52. printf("请输入插入到第几个节点之后:\n");
    53. int num;
    54. scanf("%d",&num);
    55. Node *p = head;//指向头节点
    56. int count=0;//计数
    57. while (p != NULL) {
    58. count++;
    59. if (count == num) {
    60. break;
    61. }
    62. p=p->pNext;
    63. }
    64. Node *p2 = p->pNext;
    65. p->pNext = newNode;
    66. newNode->pNext = p2;
    67. printf("插入节点成功!\n");
    68. }
    69. //修改节点
    70. void modifyNode(){
    71. int num;
    72. printf("请输入您要修改的节点:\n");
    73. scanf("%d",&num);
    74. Node *p = head;//指向头节点
    75. int count = 0;//计数
    76. while (p != NULL) {
    77. count++;
    78. if (count == num) {
    79. break;
    80. }
    81. p=p->pNext;
    82. }
    83. printf("请输入NPC的名字 攻击力 生命值:\n");
    84. scanf("%s %d %d",p->data.name,&p->data.attack,&p->data.hp);
    85. printf("修改节点\n");
    86. }
    87. //删除节点
    88. void deleteNode(){
    89. int num;
    90. printf("请输入要删除第几个节点:\n");
    91. scanf("%d",&num);
    92. Node *p = head;//指向头节点
    93. int count = 0;//统计节点数
    94. while (p != NULL) {
    95. count++;
    96. p=p->pNext;
    97. }
    98. if (count == 1) {//删除头节点
    99. p=head;
    100. head = head->pNext;
    101. free(p);//将原来的节点释放掉
    102. }else if(count == num){//删除最后一个节点
    103. Node *q = head;//指向头节点
    104. while (q->pNext->pNext != NULL) {
    105. q = q->pNext;
    106. }
    107. free(q->pNext->pNext);//释放节点
    108. q->pNext = NULL;
    109. }else{
    110. Node *q1 = head;//指向头节点
    111. int n=1;//统计节点数
    112. while (q1 != NULL) {
    113. n++;
    114. if (n == num) {
    115. break;
    116. }
    117. q1 = q1->pNext;
    118. }
    119. Node * p2 = q1->pNext;
    120. q1->pNext = p2->pNext;//q1->pNext->pNext
    121. free(p2);
    122. }
    123. printf("删除节点成功!\n");
    124. }
    125. int main(int argc, const char * argv[]) {
    126. // 如何实现一个链表,当用户希望添加NPC的时候,可以在链表上增加一个NPC变量的节点,输出所有的节点,插入,修改,删除,退出系统
    127. printf("NPC管理系统!\n");
    128. int num;
    129. while (1) {
    130. printf("\n1.添加NPC节点\n");
    131. printf("2.输出所有NPC的节点\n");
    132. printf("3.插入NPC的节点\n");
    133. printf("4.修改NPC的节点\n");
    134. printf("5.删除NPC的节点\n");
    135. printf("6.退出系统\n");
    136. printf("请选择所需操作:\n");
    137. scanf("%d",&num);
    138. switch (num) {
    139. case 1:
    140. addNode();//添加节点
    141. break;
    142. case 2:
    143. printAllNode();//输出所有节点
    144. break;
    145. case 3:
    146. insertNode();//插入节点
    147. break;
    148. case 4:
    149. modifyNode();//修改节点
    150. break;
    151. case 5:
    152. deleteNode();//删除节点
    153. break;
    154. case 6:
    155. return 0;
    156. break;
    157. default:
    158. break;
    159. }
    160. }
    161. return 0;
    162. }