C++ 动态创建链表

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

struct Node
{
    int data;
    Node* next;
};


Node* init_Node_m_head() //动态创建头节点
{
    Node* temp = (Node*)malloc(sizeof(Node));
    temp->data = 0;
    temp->next = NULL;
    return temp; //返回头节点结构体指针

}




void end_ADD(Node* Node_Data, Node* other) //传入头节点,和子节点,在尾部挂载节点 
{
    Node*  now_m_head = Node_Data;  //定义一个变量指向头节点的下一个节点
    while (now_m_head->next!=NULL)  //循环遍历该节点是否是最后一个节点
    {
        now_m_head = now_m_head->next; //如果该节点不是最后一个节点,则把当前指针指向下一个节点
    }
    other->next = now_m_head->next;   //找到最后一个节点,把空地址赋值给子节点的next
    now_m_head->next = other;         //把最后一个节点赋值为子节点

}

void printf_Node(Node*  Node_Data) //打印链表
{
    Node* temp = Node_Data->next;

    while (temp != NULL)
    {
        printf("%d->", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

Node*  Node_init_zi(int n)  //动态创建子节点
{
    Node*  temp = (Node*)malloc(sizeof(Node));  //动态申请Node类型的结构体
    if (temp == NULL) //如果申请内存失败,则返回空
    {
        return NULL;
    }
    temp->data = n;    //将n赋值给结构体变量,
    return temp;
}


void Add(Node* Node_m_head, Node* other) //在头节点后开始插入节点    
{
    other->next = Node_m_head->next;  //将子节点的next赋值为头节点的next;
    Node_m_head->next = other;        //将头节点的next赋值为子节点

}

Node* rand_add(Node* Node_m_head,int n,Node* other)//按指定位置插入数据
{
    Node* temp = Node_m_head->next;  //指向下一个节点
    Node* last = Node_m_head;        // 指向头节点
    int i = 0; //定义一个位置
    do
    {
        ++i;
        if (i == n)  //如果当前的位置和所要查找的位置一样,则把num存放到单链表上并挂在节点上 截断的节点挂在该新生成的节点尾部
        {
            Node* p=other;  // 定义一个Node指针指向新节点
            p->next = temp;       //把截断的链表挂载在p的next上
            last->next = p;            //把新生成的节点,挂载temp的后面
            return Node_m_head;      //返回头节点数据
        }
        if (temp != NULL)
        {
            last = temp;  //把上一个节点指向当前节点
            temp = temp->next;//把当前节点指向下一个节点

        }
            
    } while (temp != NULL);

    printf("您输入的位置有误,链表中未存储这么多的数据!\n");
    printf("是否需要把数据插到最后面? 请输入1或者0, 1则插入到节点尾部,否则结束!\n");
    int k;
    scanf("%d",&k);
    if (k == 1)
    {
        Node* p = other;
        end_ADD(Node_m_head,p);
        return Node_m_head;
    }
    else
        return NULL;
    
}

Node* free_someone(Node* Node_m_head, int n)  //指定删除某一个位置的节点
{
    Node* temp = Node_m_head->next;  //指向下一个节点
    Node* last = Node_m_head;        // 指向头节点
    int i = 0; //定义一个位置

    do 
    {
        ++i;
        if (i == n) //如果找到了该位置的节点 则把后面的节点的值挂到前面来
        {
            last->next = temp->next;
            free(temp);
            printf("第%d个节点已释放!\n", i);
            return Node_m_head;
        }
        else
        {
            last = temp;
            temp = temp->next;
        }
        
            

    } while (temp!= NULL);
    printf("大兄弟,链表中是空的,你想干啥??!\n");
    return Node_m_head;
}

void clear(Node* Data_m_head)
{
    Node* temp = Data_m_head->next;
    Node* now_jiedian;
    while (temp != NULL)
    {
        now_jiedian = temp;
        temp = temp->next;
        free(now_jiedian);
    
    }

    printf("释放完成,链表已经清空\n");
    printf("链表已更新,新的链表打印如下:\n");
    printf_Node(Data_m_head);
}


void play()
{
    printf("--------------------------------------\n");
    printf("1:链表初始化\n");
    printf("2:创建单链表并在链表尾部插入\n");
    printf("3:创建单链表并在头节点处插入\n");
    printf("4:指定位置添加节点\n");
    printf("5:指定删除某个位置的节点\n");
    printf("6:打印当前链表\n");
    printf("7:退出程序\n");
    printf("--------------------------------------\n");

    Node* Node_Data1 = init_Node_m_head(); //初始化头节点
    while (1)
    {

        printf("请输入选项\n");

        int num;
        scanf("%d", &num);

        switch (num)
        {

        case 1: //初始化链表,将链表的内容全部清空并重新动态创建一个节点
            clear(Node_Data1);
            break;
        case 2:   //动态创建一个节点,并从尾部插入
            printf("即将在尾部插入节点\n");
            int num1, num2;

            printf("请输入创建的单链表的个数(只能输入整数):");
            scanf("%d", &num1);

            for (int i = 0; i < num1; i++)
            {
                printf("请输入创建链表的值(只能输入整数):");
                scanf("%d", &num2);
                Node* temp = Node_init_zi(num2);
                end_ADD(Node_Data1, temp);
            }
            printf("链表已更新,新的链表打印如下:\n");
            printf_Node(Node_Data1);

            break;
        case 3:  //动态创建一个节点,并从头部插入
            printf("即将在头节点处插入一个节点\n");

            int num3,  num4;
            printf("请输入创建的单链表的个数(只能输入整数):");
            scanf("%d", &num3);

            for (int i = 0; i < num3; i++)
            {
                printf("请输入创建链表的值(只能输入整数):");
                scanf("%d", &num4);
                Node* temp = Node_init_zi(num4);
                Add(Node_Data1, temp);
            }
            printf("链表已更新,新的链表打印如下:\n");
            printf_Node(Node_Data1);
            break;
        case 4:  //指定位置进行插入
            printf("即将在指定位置添加节点\n");
            int num5, num6, num7;

            printf("请输入创建的单链表的个数(只能输入整数):");
            scanf("%d", &num5);

            for (int i = 0; i < num5; i++)
            {
                printf("请输入创建的链表的位置(只能输入整数):");
                scanf("%d", &num6);
                printf("请输入创建链表的值(只能输入整数):");
                scanf("%d", &num7);
                Node* temp = Node_init_zi(num7);
                rand_add(Node_Data1, i+num6,temp);
            }
            printf("链表已更新,新的链表打印如下:\n");
            printf_Node(Node_Data1);

            break;
        case 5:  //指定位置删除
            int num8, num9;
            printf("即将要删除一个节点\n");
            printf("请输入要删除的单链表的个数(只能输入整数):");
            scanf("%d", &num8);

            for (int i = 0; i < num8; i++)
            {
                printf("请输入要删除的链表的位置(只能输入整数):");
                scanf("%d", &num9);

                free_someone(Node_Data1,i+num9);
                printf("链表已更新,新的链表打印如下:\n");
                printf_Node(Node_Data1);
            }            

            break;
        case 6:

            printf_Node(Node_Data1);
            break;


        case 7 :
            printf("----------程序即将退出----------");
            exit(0);
    

            default:
            break;
        }
    }
    
}


int main()
{
    


    play();

    system("pause");
    return 0;
}

 

posted @ 2020-03-15 18:38  神迹丶  阅读(1937)  评论(0编辑  收藏  举报
网站已运行: