链表

《Data Structures and Algorithm Analysis in C》(数据结构与算法分析 C语言描述)

单链表
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

/*
    带头节点header的链表
    header --> first_node --> ...
*/
typedef int element_type;
struct Node
{
    element_type element;
    Node *next;
};
typedef Node *node_ptr;
typedef node_ptr List;
typedef node_ptr Position;

int is_empty_(List H)
{
    return H->next == NULL;
}
int is_last(Position P)
{
    return P->next == NULL;
}
void print_all(List H)
{
    Position t = H->next;
    int cnt = 1;
    while (t != NULL)
    {
        cout << "node " << cnt++ << ": " << t->element << endl;
        t = t->next;
    }
}

Position find_x(element_type x, List H)
{
    Position t = H->next;
    while (t != NULL && t->element != x)
    {
        t = t->next;
    }
    return t;
}
Position find_previous(element_type x, List H)
{
    Position p = H;
    while(p->next != NULL && p->next->element != x)
        p = p->next;
    return p;
}
void delete_fir_x(element_type x, List H)
{
    Position p = find_previous(x, H);  // 等于x的前一个位置
    // p --> to_del --> q
    if(!is_last(p))
    {
        // p->next = p->next->next;

        Position temp = p->next;  // x所在位置
        p->next = temp->next;     // p重新指向x下一位置
        free(temp);
    }
}
void insert_aft_p(element_type x, List H, Position p)
{
    // p --> (to_ins -->) q
    List to_ins = (List)malloc(sizeof(Node));
    to_ins->element = x;

    to_ins->next = p->next;  
    p->next = to_ins;       // 先此步则找不到q
}
void delete_list(List H)
{
    Position next, p = H->next;  // 先暂时记录其指向的位置
    H->next = NULL;        // 后破坏指针(不再指向)
    while(p != NULL)
    {
        next = p->next;
        free(p);
        p = next;
    }
}

void append_x(element_type x, List H)
{
    Position p = H;
    while(!is_last(p))
        p = p->next;
    List last = (List)malloc(sizeof(Node));
    last->element = x;
    last->next = NULL;
    p->next = last;
}
void push_x(element_type x, List H)
{
    insert_aft_p(x, H, H);
}
void test()
{
    List header = (List)malloc(sizeof(Node));
    header->next = NULL;
    cout << is_empty_(header) << endl;

    List first = (List)malloc(sizeof(Node));
    first->element = 1;
    first->next = NULL;

    Node second;
    second.element = 2;
    second.next = NULL;
    
    List third = (List)malloc(sizeof(Node));
    third->element = 4;
    third->next = NULL;

    header->next = first;
    first->next = &second;
    second.next = third;

    cout << "find x=2: ";
    Position p = find_x(2, header);
    if (p != NULL)
    {
        cout << p->element << endl;   
    }

    print_all(header);printf("---\n");
    delete_fir_x(2, header);
    print_all(header);printf("---\n");
    insert_aft_p(3, header, find_x(4, header));
    print_all(header);printf("---\n");
    delete_list(header);
    cout << is_empty_(header) << endl;
    append_x(2, header);
    append_x(1, header);
    push_x(5, header);
    print_all(header);
}
int main()
{
    test();
    return 0;
}

双链表,循环链表
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

/*
    双链表,循环链表
*/
typedef int element_type;
struct Node
{
    element_type element;
    Node *next;
    Node *prev;
};
typedef Node *node_ptr;
typedef node_ptr List;
typedef node_ptr Position;

void travers_backward(Position last)
{
    Position p = last;
    while (p != NULL)
    {   
        cout << "node: " << p->element << endl;
        p = p->prev;
    }
}
void delete_node(List del, Position first)
{
    if(first == NULL || del == NULL)
        return;
    if(first == del)
    {
        first = del->next;  // 改变首节点指针
    }
    // 简化了删除
    if(del->next != NULL)
        del->next->prev = del->prev;
    if(del->prev != NULL)
        del->prev->next = del->next;
    free(del);
}

void travers_any(Position any)
{
    if(any == NULL)
        return;
    cout << "node: " << any->element << endl;
    Position t = any->next;
    while(t != any)
    {
        cout << "node: " << t->element << endl;
        t = t->next;
    }
}
void test_dll()
{
    List first = (List)malloc(sizeof(Node));
    first->element = 1;
    first->next = first->prev = NULL;

    List second = (List)malloc(sizeof(Node));
    second->element = 2;
    second->next = NULL;
    second->prev = first;
    first->next = second;
    
    List third = (List)malloc(sizeof(Node));
    third->element = 3;
    third->next = NULL;
    third->prev = second;
    second->next = third;

    travers_backward(third);
    cout << "---" << endl;
    delete_node(first, first);
    travers_backward(third);
    cout << "---" << endl;
   
}
void test_cll()
{
    List first = (List)malloc(sizeof(Node));
    first->element = 1;
    first->next = first->prev = NULL;

    List second = (List)malloc(sizeof(Node));
    second->element = 2;
    second->next = NULL;
    second->prev = first;
    first->next = second;
    
    List third = (List)malloc(sizeof(Node));
    third->element = 3;
    third->prev = second;
    second->next = third;

    third->next = first;
    first->prev = third;

    travers_any(second);
}
int main()
{
    // test_dll();
    test_cll();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值