美文网首页
单向链表的创建、查找、删除、打印

单向链表的创建、查找、删除、打印

作者: 小小唯大大胖 | 来源:发表于2018-03-27 22:16 被阅读0次

    链表结点的定义:
    struct ListNode
    {
    int m_nKey;
    ListNode* m_pNext;
    };
    1、单链表的创建
    注意要创建头结点
    ListNode create(int data,int len)//data[]输入的数组,len是输入数组长度
    {
    ListNode head,p,
    q;//定义三个结点,首、中、尾
    //head=(ListNode
    )malloc(sizeof(ListNode));
    head=new ListNode;//创建头节点
    int i;
    for(i=0;i<len;i++)
    {
    //p=(ListNode*)malloc(sizeof(ListNode));
    p= new ListNode;//每次插入一个,就新建一个结点
    p->m_nKey=data[i];
    if(i==0)
    {
    head->m_pNext=p;//头结点
    }
    else
    {
    q->m_pNext=p;
    }
    q=p;
    }
    q->m_pNext=NULL;//链表最后一个指针为NULL
    return head;
    }
    2、链表打印
    void print_ListNode(ListNode *head)
    {
    ListNode *p;
    if(head->m_pNext==NULL)
    {
    cout<<"链表为空"<<endl;
    return;
    }
    p=head->m_pNext;
    while(p!=NULL)
    {
    cout<<p->m_nKey<<" ";
    p=p->m_pNext;
    }
    cout<<endl;
    }
    3、链表结点的删除
    要找到删除结点前一结点的位置。从表头开始遍历,发现结点p的m_pNext指向要删除的结点i,于是我们可以把结点p的m_pNext指向i的下一个结点。指针调整后,就可以安全地删除结点i并保证链表没有断开。
    ListNode delete_node(ListNode pListHead, int k)//要删除k,需要找到k值前一个节点
    {
    if(pListHead==NULL)
    return NULL;
    ListNode *p1=NULL;
    ListNode *p2=NULL;
    p1=pListHead;
    if(p1->m_pNext->m_nKey==k)//删除的结点是第一个节点
    {
    p2=p1->m_pNext;
    pListHead->m_pNext=p2->m_pNext;
    delete p2;
    return pListHead;
    }
    else //删除的结点是第一个节点

    {
        while(p1->m_pNext!=NULL)
        {
            if(p1->m_pNext->m_nKey==k)
            {
                p2=p1->m_pNext;
                p1->m_pNext=p2->m_pNext;
                delete p2;
            }
            else
            {
                p1=p1->m_pNext;
            }
        }
    }
    return pListHead;
    

    }
    主函数如下:#include<stdio.h>

    include<iostream>

    include<vector>

    include<map>

    include<algorithm>

    using namespace std;
    struct ListNode
    {
    int m_nKey;
    ListNode* m_pNext;
    };
    ListNode *create(int *data,int len);
    ListNode FindKthToTail(ListNode pListHead, int k);
    void print_ListNode(ListNode *head) ;
    int main()
    {
    int num,n;
    while(cin>>num)
    {
    cout<<"输入"<<num<<"个整数:"<<endl;
    int *data=new int[num];
    for(int i=0;i<num;i++)
    {
    cin>>data[i];
    }
    ListNode head,p;
    head=create(data,num);
    cout<<"创建的链表为:"<<endl;
    print_ListNode(head);
    cout<<"输入删除的结点:"<<endl;
    cin>>n;
    p=delete_node(head,n);
    cout<<"输入删除的结点后链表为:"<<endl;
    print_ListNode(p);
    }
    return 0;
    }

    相关文章

      网友评论

          本文标题:单向链表的创建、查找、删除、打印

          本文链接:https://www.haomeiwen.com/subject/ielecftx.html