數據結構-編程實現一個雙向鏈表節點的插入


1:這里分為兩種插入情況:一種是 插入位置在中間,另一種是插入位置在末尾。兩種情況有一點不同:插入位置在中間時需要把p的原后繼節點的前驅指針指向新插入的節點。

// ConsoleApplication24.cpp : 定義控制台應用程序的入口點。
//

#include "stdafx.h"
#include<malloc.h>
#include <iostream>
#include <assert.h>
using namespace std;

typedef struct DbNode //雙向鏈表結構體
{
    int data;//節點數據
    DbNode *left;//前驅節點指針
    DbNode *right;//后繼節點指針
}DbNode;

DbNode *CreateNode(int data)//創建一個節點,返回新創建的節點
{
    DbNode *pnode = (DbNode*)malloc(sizeof(DbNode));
    pnode->data = data;
    pnode->left = pnode->right = pnode;//初始化的節點的前驅和后繼都等於本身的地址
    return pnode;
}

DbNode *CreateList(int head)//創建一個鏈表頭,參數給出表頭節點數據,表頭節點不作為存放有意義數據的節點
{
    DbNode *pnode= (DbNode*)malloc(sizeof(DbNode));
    pnode->data = head;
    pnode->left =  pnode;
    pnode->right = NULL;
    return pnode;
}

/*插入新節點,總是在表尾插入;返回表頭節點*/
DbNode *AppendNode(DbNode *head, int data)//參數1是鏈表的表頭節點,參數2是要插入的節點,其數據為data
{
    DbNode *node = CreateNode(data);//創建數據為data的新節點
    DbNode *p = head, *q=NULL;
    while (p != NULL)//循環結束后,最后一個節點是q,p是q的right
    {
        q = p;
        p = p->right;
    }
    /*---在雙向鏈表尾部插入新節點的方法---*/
    q->right = node;
    node->left = q;
    node->right = NULL;
    /*---*/
    return head;
    
}

void PrintList(DbNode *head)//打印整個鏈表
{
    DbNode *pnode = NULL;
    if (head == NULL)//鏈表為空
    {
        return;
    }
    pnode = head;
    while (pnode != NULL)
    {
        printf("%d", pnode->data);
        pnode = pnode->right;
    }
    printf("\n");
}

int GetLength(DbNode *head)//雙向鏈表的測長,參數為鏈表頭節點
{
    int count = 1;
    DbNode *pnode = NULL;
    if (head==NULL)//head為NULL表示鏈表空
    {
        return 0;
    }
    pnode = head->right;
    while (pnode != NULL)
    {
        pnode = pnode->right;//使用right指針遍歷
        count++;
    }
    return count;
}

/*查找節點,成功返回滿足條件的節點指針,否則返回NULL*/
DbNode *FindNode(DbNode *head, int data)//參數1是鏈表的頭結點,參數2是要查找的節點,其數據為data
{
    DbNode *pnode = head;
    if (head == NULL)//head為NULL表示鏈表空
    {
        return NULL;
    }
    /*找到數據或者到達鏈表末尾,推出while循環*/
    while (pnode->right != NULL && pnode->data != data)
    {
        pnode = pnode->right;//使用right指針遍歷
    }
    //沒有找到數據為data的節點,返回NULL
    if (pnode->right == NULL)
    {
        return NULL;
    }
    return pnode;
}

/*在node節點之后插入新節點*/
void InserNode(DbNode *node, int data)
{
    DbNode *newnode = CreateNode(data);
    DbNode *p = NULL;

    if (node == NULL)//node為NULL時返回NULL
    {
        return ;
    }
    if (node->right == NULL)//node為最后一個節點
    {
        node->right = newnode;
        newnode->left = node;
    }
    else//node為中間節點
    {
        newnode->right = node->right;
        node->right->left = newnode;
        node->right = newnode;
        newnode->left = node;
    }
}


int main()
{
    /*---生成從0-9含有10個節點的循環鏈表---*/
    DbNode *head = CreateList(0);//生成鏈表頭
    for (int i = 1; i < 10; i++)
    {
        head = AppendNode(head, i);//添加9個節點,數據為從1到9
    }
    PrintList(head);

    cout << "找到數據為2的節點,地址為:" << FindNode(head, 2) << endl;
    cout << "數據為:" << FindNode(head, 2)->data << endl;
    InserNode(FindNode(head, 2), 666);
    cout << "在數據為2的節點后插入666:" << endl;
    PrintList(head);
    return 0;
}
View Code

運行結果:


免責聲明!

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



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