欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

链表的学习(2)

程序员文章站 2022-03-11 21:49:03
...

实现的链表操作:
1、指定位置删除和插入。
2、Merge两个链表
代码:

/*
    Name: LinkedList
    Author: Bryant_xw
    Date: 2018-09-27-11.11.53
*/


#include<bits/stdc++.h>
using namespace std;

typedef struct Node
{
    int data;
    struct Node* next;
}Node,Linklist;


void tail_insert(Linklist *L, int n)
{
    int num;
    Node* temp = L;
    printf("Please Input %d nums: ",n);
    for(int i =0 ; i < n; i++)
    {
        scanf("%d",&num);
        Node* new_node = (Node*)malloc(sizeof(Node));
        new_node->next = NULL;
        new_node->data = num;
        temp->next = new_node;
        temp = new_node;
    }
    temp->next = NULL;
}

bool delete_node(Linklist *L, int pos) //删除第pos个结点
{
    int i = 0;
    Node* p = L;
    while(i < pos-1 && p->next)
    {
        p = p->next;
        i++;
    }
    //删除的位置不合理
    if(p->next==NULL || i>pos-1)
        return false;
    Node* tmp = p->next;
    p->next = tmp->next;
    free(tmp);
    tmp = NULL;
    return true;
}

//指定位置插入元素num
bool InsertPos(Linklist* L, int pos , int num)
{
    Node* p = L;
    int i = 0;
    Node* new_node =(Node*)malloc(sizeof(Node));
    new_node->data = num;
    //new_node->next = NULL;

    while(i < pos-1 && p->next)
    {
        p = p->next;
        i++;
    }

    if(!p || i>pos-1)
        return false;
    new_node->next = p->next;
    p->next = new_node;
    return true;
}

void MergeList(Linklist* L1, Linklist* L2, Linklist* L3)
{
    //L1单增,L2单增
    Node* p1 = L1->next;
    Node*p2 = L2->next;
    Node*p3 = L1;
    L3 = L1;
    while(p1 && p2)
    {
        if(p1->data <= p2->data)
        {
            p3->next = p1;
            p3 = p1;
            p1 = p1->next;
        }

        else
        {
            p3->next = p2;
            p3 = p2;
            p2 = p2->next;
        }
    }

    p3->next = p1 ? p1 : p2;
    free(L2);
}

void Print(Linklist *L)
{
    Node* p = L->next;
    if(p)
    {
        printf("%d",p->data);
        p = p->next;
    }
    while(p)
    {
        printf("->%d",p->data);
        p = p->next;
    }
    printf("\n");
}




int main()
{
    int n,num;
    Linklist *L = (Node*)malloc(sizeof(Node));
    //------------------------------------------//
    printf("Please Input Insert nums:");
    scanf("%d",&n);
    tail_insert(L,n);
    printf("LinkList Contains(tail_insert):");
    Print(L);
    //------------------------------------------//
    printf("Please Input delete pos:");
    scanf("%d",&n);
    if(delete_node(L,n))
        Print(L);
    else
        printf("delete pos is error!\n");
    //------------------------------------------//
    printf("Please Input insert pos and pos's num:");
    scanf("%d%d",&n,&num);
    if(InsertPos(L,n,num))
        Print(L);
    else
        printf("insert pos is error!\n");
    //------------------------------------------//
    return 0;
}


//int main(){
//    int n;
//    Linklist *L1 = (Node*)malloc(sizeof(Node));
//    Linklist *L2 = (Node*)malloc(sizeof(Node));
//    Linklist* L3;
//    //-------------------------------------------//
//    printf("Please Input Insert nums:");
//    scanf("%d",&n);
//    tail_insert(L1,n);
//    printf("LinkList1 Contains(tail_insert):");
//    Print(L1);
//    //-------------------------------------------//
//    printf("Please Input Insert nums:");
//    scanf("%d",&n);
//    tail_insert(L2,n);
//    printf("LinkList2 Contains(tail_insert):");
//    Print(L2);
//    //-------------------------------------------//
//    printf("MergeList LinkList3 Contains(tail_insert):");
//    MergeList(L1,L2,L3);
//    Print(L1);
//    return 0;
//}

相关标签: 链表