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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM