c/c++ 单链表 创建 插入 删除 翻转 打印

单链表的实现方式有很多,多数地方的代码不成体系,所以在此整理介绍一下,希望可以让你对单链表的知识有一个系统的认识。

大致说一下,单链表的结构是由指针将数据结点连接起来的数据结构,不同于数组,单链表是一种动态的数据结构,其结点在进行创建的时候,才进行内存的分配,而不是事先已经分配好的。

下面介绍单链表的创建过程。首先是定义结点的数据结构:

typedef struct node
{
    int data;
    struct node *next;
};

结点结构定义完成之后,进行单链表的创建,注意单链表最重要的是头结点,只有通过头结点,才可以实现对单链表的访问。单链表创建代码如下:

node* create()
{
    node* head;
    head = (node*)malloc(sizeof(node));
    head->data=0;
    head->next=nullptr;
    int num=1;
    while(num!=0)
    {
        cout << "Please input the data: ";
        cin >> num;

        if(0==num)break;
        //instNodeHead(head, num);
        instNodeTail(head, num);
    }
    return head;
}

上述在进行单链表创建的时候,涉及到在单链表中插入数据的方式,有两种插入方式,头插入与尾插入,我分别创建了两个函数,以实现结点的插入:

1:头插法   instNodeHead(head,num);

2:尾插法   instNodeTail(head,num);


单链表头插法代码:

void instNodeHead(node* head, int num_inst)
{
    node* p0;
    p0 = (node*)malloc(sizeof(node));
    p0->data=num_inst;
    p0->next=head->next;
    head->next=p0;
}

单链表尾插法代码:

void instNodeTail(node* head, int num_inst)
{
    node *p0;
    p0=(node*)malloc(sizeof(node));
    p0->data=num_inst;
    while(head->next!=nullptr)
    {
        head=head->next;
    }
    p0->next=head->next;
    head->next=p0;
}

关于代码的具体应用,稍后再主函数中,我们会进行一一测试。下面介绍一下单链表结点删除操作:

void delNode(node* head, int num_del)
{
    node *p0,*p1;
    p0=head;
    while(num_del!=p0->data && p0->next!=nullptr)
    {
        p1=p0;
        p0=p0->next;
    }
    if(num_del==p0->data)
    {
        if(p0==head)
        {
            head=p0->next;
            free(p0);
        }
        else{p1->next=p0->next;}
    }
    else{cout<<"could not found!!!"<<endl;}
}


然后是单链表的翻转操作:

void reverseNode(node* head)
{
    node *p2,*p3;
    int linkLength = length(head);
    if(linkLength==1)return;
    p2=head->next;head->next=nullptr;
    while(p2)
    {
        p3=p2->next;
        p2->next=head;
        head=p2;
        p2=p3;
    }
}


搜索中间结点,这里使用的是快慢指针的方法:

void searchmid(node* head,node* mid)
{
    node* temp=head;
    while(head->next->next != nullptr)
    {
        head = head->next->next;
        temp = temp->next;
        mid = temp;
    }
    cout << "Middle data is: " << mid->data << endl;
}

打印单链表操作:

void print(node* head)
{
    while(head->next!=nullptr)
    {
        cout << head->data << endl;
        head=head->next;
    }
    cout << head->data << endl;
}

计算单链表的长度:

int length(node* head)
{
    node* p0;
    int nodeCnt=0;
    p0=head;
    while(p0!=nullptr)
        {
            nodeCnt++;
            p0=p0->next;
        }
    return nodeCnt;
}

通过以上代码的编写,我再main()函数里面写了几段代码,对以上函数进行测试,下面是测试代码:

int main()
{
    node *head,*midNode;
    int linkLength=0;
    head=create();
    print(head);
    searchmid(head, midNode);
    int num_del;
    cout<<"Please input number to delete: ";
    cin>>num_del;
    delNode(head,num_del);
    print(head);
    linkLength=length(head);
    cout<<"LinkLength is: "<<linkLength<<endl;
    reverseNode(head);
    print(head);
    return 0;
}




















  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表插入删除可以通过以下代码实现: ```c++ #include <iostream> using namespace std; // 定义链表节点结构体 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; // 在链表插入节点 ListNode* insertAtHead(ListNode* head, int val) { ListNode* node = new ListNode(val); node->next = head; return node; } // 在链表插入节点 ListNode* insertAtTail(ListNode* head, int val) { ListNode* node = new ListNode(val); if (head == NULL) { head = node; } else { ListNode* cur = head; while (cur->next != NULL) { cur = cur->next; } cur->next = node; } return head; } // 在链表删除节点 ListNode* deleteNode(ListNode* head, int val) { if (head == NULL) { return NULL; } else if (head->val == val) { ListNode* newHead = head->next; delete head; return newHead; } else { ListNode* cur = head; while (cur->next != NULL && cur->next->val != val) { cur = cur->next; } if (cur->next != NULL) { ListNode* temp = cur->next; cur->next = cur->next->next; delete temp; } return head; } } // 打印链表 void printList(ListNode* head) { ListNode* cur = head; while (cur != NULL) { cout << cur->val << " "; cur = cur->next; } cout << endl; } int main() { ListNode* head = NULL; // 在链表插入节点 head = insertAtHead(head, 1); head = insertAtHead(head, 2); head = insertAtHead(head, 3); printList(head); // 3 2 1 // 在链表插入节点 head = insertAtTail(head, 4); head = insertAtTail(head, 5); head = insertAtTail(head, 6); printList(head); // 3 2 1 4 5 6 // 在链表删除节点 head = deleteNode(head, 3); head = deleteNode(head, 6); printList(head); // 2 1 4 5 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值