单链表,循环链表以及双向链表的代码编写

单链表

一,结点构成

struct Node
{
    int data;
    Node *next;
};

data即为本结点存放数据的地方(定义更多变量,一个结点存的值也就更多),next即为指向下一个,

eg:Node *head;     head->data=5;表示head结点存值为5,head->next=NULL,即表示下一个指向为空。

一般头结点的值域都为空,即头结点的data不存值。

而且头结点比较重要,可以穿起来整串链表,所以一般不会对head进行改变,当需要改变时,新定义一个来代替head

二,插入值的方法

1,前插法(插入到头结点后面);

void CreatH(Node *head)   
{
    int n;
    cin >> n;       //要新定义几个结点
    for (int i = 0; i < n; i++)
    {
        Node *p = new Node;         //定义一新节点存值
        cin >> p->data;     
        p->next = head->next;          //将新节点加到头结点后面
        head->next = p;                   
    }
}

所以最后将结点p插入到了head和head->next中间

2,后插法(插入到链表末尾):
void CreatB(Node *head)    //后插
{
    int n;
    cin >> n;
    Node *p = new Node;
    p = head;                                     //定义新节点来代替head进行改变,因为后插法是从链表末尾进行插入
    for (int i = 0; i < n; i++)
    {
        Node *q = new Node;
        cin >> q->data;
        q->next = p->next;
        p->next = q;
        p = q;
    }
}

二,获得第几个结点的值

void GetI(Node *head, int i)   
{
    Node *p = new Node;
    p = head;
    for (int j = 1; j <= i; j++)
    {
        p = p->next;
    }
    if (i>1 && p != NULL)
    {
        cout << p->data<<endl;
    }
}

三,返回第几个结点

Node *GetP(Node *head, int i)     
{
    Node *p = new Node;
    p = head;
    for (int j = 1; j <= i;j++)
    {
        p = p->next;
    }
    return p;
}

四,在第几个结点插入值


void Insert(Node *head, int i, int j)         
{
    Node *p = new Node;
    p=GetP(head, i-1);                   //此处用到了上面的函数,因为是插入到某结点,所以要获取前一个结点
    Node *q = new Node;
    q->data = j;
    q->next = p->next;
    p->next = q;
}

五,删除第几个结点

void Delete(Node *head, int i)              
{
    Node *p = new Node;
    p = GetP(head, i - 1);           //同样用到上面函数,找到要删除结点的下一个
    Node *q = new Node;
    q = p->next;
    p->next = q->next;
    delete q;
}

六,改变某结点的值

void UpData(Node *head, int i)
{
    Node *p = new Node;
    p = GetP(head, i);                               //用上面函数直接获得该节点
    cin >> p->data;
}

七,遍历链表

void Show(Node *head)        //显示
{
    Node *p = new Node;
    p = head->next;
    while (p != NULL)
    {
        cout << p->data << "  ";
        p = p->next;
    }
}

循环链表

只需要一步,即定义头结点的时候,定义为:
    Node *head=new Node;
    head->next = head;

头结点的下一个指向头结点。

所以此时head结点也是要存值的,不然循环一遍的话,head将会出错。

此时循环终止条件可以写为:

p!=head;   或者      p->next!=head;(相比较与单链表的p!=NULL 或者 p->next !=NULL);

双向链表

一,定义

struct Node
{
    int data;
    Node *prior;
    Node *next;
};

二,数据写入


void Init(Node *head)
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        Node *p=new Node;
        cin >> p->data;
        p->prior = head->prior;
        head->prior->next = p;
        head->prior=p;
        p->next = head;
    }
}

三,删除

关键的两句代码:
    p->prior->next = p->next;
    p->next->prior = p->prior;

猜你喜欢

转载自blog.csdn.net/qq_46423166/article/details/105741556