C++链表,增删改查

//

//  main.c

//  homework_linkList

//

//  Created by jiumiao on 15/7/23.

//  Copyright (c) 2015 jiumiao. All rights reserved.

//


#include

#include


typedef struct _NPC{

    char name[20];

    int attack;

    int hp;

}NPC;


typedef struct _node{

    NPC data;

    struct _node *pNext;

}Node;


Node *head = NULL;//定义一个头节点


//添加节点

void addNode()

{

    if (head == NULL) {

        //head申请一个内存空间

        head = malloc(sizeof(Node));

        printf("请输入NPC的名字 攻击力 生命值:\n");

        scanf("%s %d %d",head->data.name,&head->data.attack,&head->data.hp);

        head->pNext=NULL;

    } else {

        Node *p = head;//指向头节点

        while (p->pNext != NULL) {

            p = p->pNext;

        }

        //申请内存空间

        p->pNext = malloc(sizeof(Node));

        p=p->pNext;

        printf("请输入NPC的名字 攻击力 生命值:\n");

        scanf("%s %d %d",p->data.name,&p->data.attack,&p->data.hp);

        

        p->pNext = NULL;

        

    }

    printf("添加节点成功!\n");

}


//输出所有节点

void printAllNode()

{

    Node *q = head;//指向头节点

    while (q!=NULL) {

        printf("名字为:%s,攻击力:%d,生命值:%d\n",q->data.name,q->data.attack,q->data.hp);

        q=q->pNext;

    }

    printf("输出所有节点成功!\n");

}


//插入节点

void insertNode()

{

    //创建一个新的节点

    Node *newNode = malloc(sizeof(Node));

    printf("请输入NPC的名字 攻击力 生命值:\n");

    scanf("%s %d %d",newNode->data.name,&newNode->data.attack,&newNode->data.hp);

    

    printf("请输入插入到第几个节点之后:\n");

    int num;

    scanf("%d",&num);

    Node *p = head;//指向头节点

    int count=0;//计数

    while (p != NULL) {

        count++;

        if (count == num) {

            break;

        }

        p=p->pNext;

    }

    Node *p2 = p->pNext;

    p->pNext = newNode;

    newNode->pNext = p2;

 

    printf("插入节点成功!\n");

}


//修改节点

void modifyNode()

{

    int num;

    printf("请输入您要修改的节点:\n");

    scanf("%d",&num);

    Node *p = head;//指向头节点

    int count = 0;//计数

    while (p != NULL) {

        count++;

        if (count == num) {

            break;

        }

        p=p->pNext;

    }

    printf("请输入NPC的名字 攻击力 生命值:\n");

    scanf("%s %d %d",p->data.name,&p->data.attack,&p->data.hp);

    

    printf("修改节点\n");

}


//删除节点

void deleteNode()

{

    int num;

    printf("请输入要删除第几个节点:\n");

    scanf("%d",&num);

    Node *p = head;//指向头节点

    

    int count = 0;//统计节点数

    while (p != NULL) {

        count++;

        p=p->pNext;

    }

    if (count == 1) {//删除头节点

        

        p=head;

        head = head->pNext;

        free(p);//将原来的节点释放掉

    }else if(count == num){//删除最后一个节点

        Node *q = head;//指向头节点

        while (q->pNext->pNext != NULL) {

            q = q->pNext;

        }

        

        free(q->pNext->pNext);//释放节点

        q->pNext = NULL;

    }else{

        Node *q1 = head;//指向头节点

        int n=1;//统计节点数

        while (q1 != NULL) {

            n++;

            if (n == num) {

                break;

            }

            q1 = q1->pNext;

        }

        Node * p2 = q1->pNext;

        q1->pNext = p2->pNext;//q1->pNext->pNext

        

        free(p2);

    }


    printf("删除节点成功!\n");

}


int main(int argc, const char * argv[]) {

    // 如何实现一个链表,当用户希望添加NPC的时候,可以在链表上增加一个NPC变量的节点,输出所有的节点,插入,修改,删除,退出系统

    

    printf("NPC管理系统!\n");

    int num;

    while (1) {

        printf("\n1.添加NPC节点\n");

        printf("2.输出所有NPC的节点\n");

        printf("3.插入NPC的节点\n");

        printf("4.修改NPC的节点\n");

        printf("5.删除NPC的节点\n");

        printf("6.退出系统\n");

        printf("请选择所需操作:\n");

        scanf("%d",&num);

        switch (num) {

            case 1:

                addNode();//添加节点

                break;

            case 2:

                printAllNode();//输出所有节点

                break;

            case 3:

                insertNode();//插入节点

                break;

            case 4:

                modifyNode();//修改节点

                break;

            case 5:

                deleteNode();//删除节点

                break;

            case 6:

                return 0;

                break;

                

            default:

                break;

        }

        

    }

    

    

    

    return 0;

}

你可能感兴趣的:(算法题)