【C++】链表相关的项目(2.0)

07-17 1240阅读

准备工作

【C++】链表相关的项目(2.0)
(图片来源网络,侵删)

首先弄几个可能会需要的头文件:

#include
#include 
#include
typedef int ADT; //定义自定义数据类型 
​
​

因为写的是关于链表的项目需要定义一个结构体:

//定义结构体 
typedef struct N
{
	ADT data;
	struct N *next;	
}Node;
​

定义有关链表的结构体:

​
//定义链表结构体 
typedef struct
{
	Node *head, *tail;//定义头尾指针 
	unsigned size;//定义变量 
}List;
​

初始化操作:

//初始化链表函数 
List *init_list(List *lp) 
{
	lp -> head = lp -> tail = (void*)0; //头尾指针为空
    lp -> size = 0;//链表个数为0
    return lp; 
}
​

制作节点(这部分仅仅跟后面的几个操作有关):

​//制作节点 
Node *make_node(ADT d)
{
	Node *np = malloc(sizeof(Node));//申请空间 
	if(!np)//申请成功 
	    return (void*)0;
	np -> data = d;
	np -> next = (void*)0;
	return np;
}
​
​

---------------------------------------------------------------------------------------------------------------------------------

这篇重要的部分来咯~

  • 1.清空链表操作
  • 2.链表头插操作
  • 3.链表尾插操作
  • 4.链表头删操作
  • 5.链表尾删操作
  • 6.查找位置操作
  • 7.插入某元素到指定位置的函数 (插入某元素之后,否则头插)
  • 8.插入某元素到指定位置的函数 (插入某元素之前,否则尾插)方法1 
  • 9.插入某元素到指定位置的函数 (插入某元素之前,否则尾插)方法2 
  • 10.删除某元素之后的第一个元素的函数 
  • 11.删除元素本身,不存在则不删的函数 方法1 
  • 12.删除元素本身,不存在则不删的函数 方法2
  • 13.按序打印链表函数

    ---------------------------------------------------------------------------------------------------------------------------------

    1.0中咱们写到5

    2.0从6开始 

    ~~~~~~~~~~~~~~~~~

    NO6 查找位置操作

    //6 
    //查找操作函数(找位置)
    // 定义了一个函数find_element,它接收一个指向List结构体的指针lp和一个ADT类型的值d作为参数。  
    // 函数返回一个整型值,表示元素d在链表中的位置(如果找到的话),或者返回0表示未找到。  
    int find_element(List *lp, ADT d)    
    {    
        // 初始化一个整型变量position为1。这个变量用于跟踪当前正在检查的节点在链表中的位置。  
        // 假设链表至少有一个元素,所以初始位置设为1。  
        int position = 1;   
          
        // 通过lp指针获取链表的头节点,并将其地址赋给Node类型的指针cur。  
        // cur将用于遍历链表。  
        Node *cur = lp->head;   
        
        // 使用while循环遍历链表。循环的条件是cur不为NULL,即当前节点不是链表的末尾。  
        while (cur)   
        {    
            // 如果当前节点的数据域data的值等于要查找的值d,  
            if (cur->data == d)   
            {    
                // 则函数直接返回当前的位置position。  
                // 这里的position是从1开始计数的,符合通常对链表元素位置的理解。  
                return position;   
            }    
        
            // 如果当前节点的数据不等于d,则将cur指针移动到下一个节点。  
            cur = cur->next;   
              
            // 同时,递增position的值,以便在下一次循环中检查下一个节点的位置。  
            position++;   
        }    
        
        // 如果循环结束(即遍历完整个链表),仍然没有找到等于d的节点,  
        // 则函数返回0,表示未找到元素。  
        return 0;   
    }

    ---------------------------------------------------------------------------------------------------------------------------------

    NO7 —— NO12(由于这六个模块都需要通过找到某个指针才能实现本身想要的功能,所以我全部归为一类)

    //查找指针函数(找某个指针) 
    Node *find_in_list(List *lp, ADT d) {
        Node *cur = lp->head; // 将cur指针初始化为链表的头节点,从头开始遍历
        while (cur && cur->data != d) { // 当cur不为空且cur指向的节点数据不等于d时,继续循环
            cur = cur->next; // 将cur指针移动到下一个节点
        }
        return cur; // 如果找到数据等于d的节点,返回该节点的指针;如果没有找到,cur将为NULL,返回NULL
    }
    //7
    //插入某元素之后,否则头插
    List *insert_some_element(List *lp, int d, Node *pos) {
        if (pos == (void*)0) // 如果pos是NULL,说明没有找到指定位置或者链表为空
            return push_front_list(lp, d); // 调用另一个函数在链表头部插入新元素d
        Node *new_node = make_node(d); // 根据元素d创建一个新的节点
        new_node->next = pos->next; // 将新节点的next指向pos节点的下一个节点,为插入做准备
        pos->next = new_node; // 将pos节点的next指向新节点,完成插入
        if (pos == lp->tail) // 如果pos是链表的尾部节点
            lp->tail = new_node; // 更新链表的尾部为新节点
        lp->size++; // 链表长度增加1
        return lp; // 返回链表的指针
    }
    //8
    //插入某元素之前,否则尾插 方法1 
    List *insert_element_front(List *lp, ADT d, Node *pos) {
        if (pos == (void*)0) // 如果pos是NULL,说明链表为空或者没有找到指定节点
            return push_back_list(lp, d); // 调用另一个函数在链表尾部插入新元素d
        if (pos == lp->head) // 如果pos是头节点
            return push_front_list(lp, d); // 调用另一个函数在头部插入新元素d
        Node *cur = lp->head; // 从链表的头节点开始遍历
        while (cur->next != pos) // 当cur的下一个节点不是pos时,继续遍历
            cur = cur->next; // 移动到下一个节点
        Node *new_node = make_node(d); // 创建一个新节点,数据为d
        new_node->next = pos; // 将新节点的next指向pos节点,为插入做准备
        cur->next = new_node; // 将cur节点的next指向新节点,完成插入
        lp->size++; // 链表长度增加1
        return lp; // 返回链表的指针
    }
    //9
    //插入某元素之前,否则尾插 方法2
    List *insert_element_front2(List *lp, ADT d, Node *pos) {
        if (pos == (void*)0) // 如果链表为空
            return push_back_list(lp, d); // 在尾部插入新元素d
        Node *new_node = make_node(pos->data); // 创建一个新节点,复制pos节点的数据
        new_node->next = pos->next; // 新节点的next指向pos节点的下一个节点
        pos->next = new_node; // 将pos节点的next指向新节点,完成插入
        pos->data = d; // 更新pos节点的数据为新元素d
        if (pos == lp->tail) // 如果pos是链表的尾部节点
            lp->tail = new_node; // 更新链表的尾部为新节点
        lp->size++; // 链表长度增加1
        return lp; // 返回链表的指针
    }
    //10
    //删除某元素之后的第一个元素的函数 
    Node *del_element_next(List *lp, Node *pos) {
        if (pos == (void*)0 || pos == lp->tail) // 如果pos是NULL或pos是链表的尾部节点,不能删除
            return (void*)0;
        Node *del = pos->next; // del指向pos节点的下一个节点,即要删除的节点
        pos->next = del->next; // 将pos节点的next指向del的下一个节点,从而跳过del节点
        if (del == lp->tail) // 如果del是链表的尾部节点
            lp->tail = pos; // 更新链表的尾部为pos节点
        free(del); // 释放del节点的内存
        lp->size--; // 链表长度减少1
        return lp; // 返回链表的指针
    }
    //11
    //删除元素本身,不存在则不删的函数 方法1 
    List *del_element_self(List *lp, Node *pos) {
        if (pos == (void*)0) // 如果pos是NULL,不执行删除
            return (void*)0;
        if (pos == lp->head) // 如果pos是头节点,使用特殊方法删除
            return pop_front_first(lp);
        Node *cur = lp->head; // 从链表的头节点开始遍历
        while (cur->next != pos) // 找到pos节点的前一个节点
            cur = cur->next;
        cur->next = pos->next; // 将cur节点的next指向pos的下一个节点,从而删除pos节点
        if (pos == lp->tail) // 如果pos是尾部节点
            lp->tail = cur; // 更新链表的尾部为cur节点
        free(pos); // 释放pos节点的内存
        lp->size--; // 链表长度减少1
        return lp; // 返回链表的指针
    }
    //12
    //删除元素本身,不存在则不删的函数 方法2 
    List *del_element_self2(List *lp, Node *pos) {
        if (pos == (void*)0) // 如果pos是NULL,不执行删除
            return (void*)0;
        if (pos == lp->tail) // 如果pos是尾部节点,使用特殊方法删除
            return pop_back_last(lp);
        Node *del = pos->next; // del指向pos节点的下一个节点
        pos->data = del->data; // 将del节点的数据复制到pos节点
        pos->next = del->next; // 将pos节点的next指向del的下一个节点,从而跳过del节点
        if (del == lp->tail) // 如果del是尾部节点
            lp->tail = pos; // 更新链表的尾部为pos节点
        free(del); // 释放del节点的内存
        lp->size--; // 链表长度减少1
        return lp; // 返回链表的指针
    }

    ---------------------------------------------------------------------------------------------------------------------------------

    NO13 按序打印链表函数

    //13
    //按序打印链表函数
    // 定义print_list函数,它接受一个指向List类型的指针lp作为参数  
    // List类型在代码段之外定义,我们假设它包含至少两个成员:head(指向链表首节点的指针)和size(链表中节点的数量)  
    void print_list(const List *lp)   
    {  
        // 打印一条分隔线,用于在输出中区分不同的链表内容  
        printf("------------------------------------------%d", current->data);  
      
                // 将current指针移动到下一个节点,继续循环直到链表末尾  
                current = current -> next;  
            }  
      
            // 打印换行符,结束当前链表的打印  
            printf("\n");  
        }   
        else  
        {  
            // 如果链表为空,则打印一条消息说明链表列表为空  
            printf(" 链表序列为空!\n");  
        }  
      
        // 打印另一条分隔线,用于在输出中区分不同的链表内容  
        printf("------------------------------------------
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]