数据结构--单链表的基本操作

单链表的取值:

#include <iostream>  
  
// 定义状态常量  
const int OK = 0;  
const int ERROR = 1;  
  
// 使用typedef为ListNode定义别名LNode  
typedef struct ListNode {  
    int data;  
    struct ListNode *next; // 使用struct ListNode而不是LNode  
} LNode, *LinkList; // 同时定义LNode和LinkList作为ListNode的别名和指针别名  
  
// 辅助函数:创建链表节点  
LNode* createNode(int data) {  
    LNode* newNode = new LNode;  
    if (!newNode) {  
        std::cerr << "Memory allocation failed!" << std::endl;  
        return nullptr;  
    }  
    newNode->data = data;  
    newNode->next = nullptr;  
    return newNode;  
}  
  
// 辅助函数:在链表末尾添加节点  
void appendNode(LinkList &head, int data) {  
    LNode* newNode = createNode(data);  
    if (!head) {  
        head = newNode;  
        return;  
    }  
    LNode* current = head;  
    while (current->next) {  
        current = current->next;  
    }  
    current->next = newNode;  
}  
  
// getelem函数,使用引用传递e  
int getelem(LinkList L, int i, int &e) {  
    LNode *p = L; // 从头节点开始遍历  
    int j = 1; // 声明并初始化变量j  
    while (p && j < i) {  
        p = p->next;  
        ++j;  
    }  
    if (!p || j > i) return ERROR; // 如果p为空或者j大于i,返回ERROR  
    e = p->data; // 将找到的元素赋值给e  
    return OK; // 返回OK  
}  
  
// 其他代码...  
  
int main() {  
    // 创建一个空链表  
    LinkList head = nullptr;  
  
    // 向链表添加节点  
    appendNode(head, 10);  
    appendNode(head, 20);  
    appendNode(head, 60);  
    appendNode(head, 40);  
    appendNode(head, 50);  
  
    // 检索并打印第二个元素(索引从1开始)  
    int element;  
    int status = getelem(head, 3, element);  
    if (status == OK) {  
        std::cout << "Element at index 2 is: " << element << std::endl;  
    } else {  
        std::cout << "Error retrieving element!" << std::endl;  
    }  
 
  
    return 0;  
}

按值查找: 

#include <iostream>  
  
// 定义状态常量  
const int OK = 0;  
const int ERROR = 1;  
using namespace std;
// 使用typedef为ListNode定义别名LNode  
typedef struct ListNode {  
    int data;  
    struct ListNode *next; // 使用struct ListNode而不是LNode  
} LNode, *LinkList; // 同时定义LNode和LinkList作为ListNode的别名和指针别名  
  
// 创建一个新节点  
LNode* CreateNode(int e) {  
    LNode* newNode = new LNode;  
    if (!newNode) {  
        std::cerr << "Memory allocation failed!" << std::endl;  
        return nullptr;  
    }  
    newNode->data = e;
    newNode->next = nullptr;  
    return newNode;  
}  
  
// 插入节点到链表尾部  
void ListInsert(LinkList &L, int e) {  
    LNode* newNode = CreateNode(e);  
    if (!L) {  
        L = newNode; // 如果链表为空,新节点即为头节点  
    } else {  
        LNode* p = L;  
        while (p->next) {  
            p = p->next;  
        }  
        p->next = newNode; // 将新节点添加到链表尾部  
    }  
}  
  
// 遍历链表并打印元素  
void PrintList(LinkList L) {  
    LNode* p = L;  
    while (p) {  
        std::cout << p->data << " ";  
        p = p->next;  
    }  
    cout << endl;  
}  
  
// 查找元素并返回指向该元素的指针,如果未找到则返回nullptr  
LNode* LocateElem(LinkList L, int e) {  
    LNode* p = L;  
    while (p && p->data != e) {  
        p = p->next;  
    }  
    return p; // 如果找到,p不为空;如果未找到,p为空  
}  
  
int main() {  
    // 初始化链表为空  
    LinkList L = nullptr;  
  
    // 插入几个元素到链表  
    ListInsert(L, 1);  
    ListInsert(L, 2);  
    ListInsert(L, 3);  
    ListInsert(L, 4);  
    ListInsert(L, 5);  
  
    // 打印链表以验证元素已正确插入  
    PrintList(L);  
  
    // 查找元素3并打印结果  
    LNode* p = LocateElem(L, 3);  
    if (p) {  
        cout << "Element found: " << p->data << endl;  
    } else {  
        cout << "Element not found." << endl;  
    }  
  
    // 查找元素10(不存在)并打印结果  
    p = LocateElem(L, 10);  
    if (p) {  
        cout << "Element found: " << p->data << endl;  
    } else {  
        cout << "Element not found." << endl;  
    }  

    return 0;  
}

单链表的遍历输出:

#include <iostream>  
  
// 假设 DataType 已经定义,例如 using DataType = int;  
using DataType = int;  
  
struct Node {  
    DataType data;  
    Node* next;  
  
    Node(DataType val = 0, Node* nextPtr = nullptr) : data(val), next(nextPtr) {}  
};  
  
// 建立一个带头结点的空链表  
Node* InitList() {  
    Node* first = new Node; // 分配头结点内存  
    first->next = nullptr;    // 初始化头结点的next指针为nullptr  
    return first;  
}  
  
// 遍历单链表  
void PrintList(Node* first) {  
    Node* p = first->next; // 从头结点的下一个节点开始遍历  
    while (p != nullptr) {  
        std::cout << p->data << " ";  
        p = p->next;  
    }  
    std::cout << std::endl;  
}  
  
// 在头结点后面插入一个新结点,结点的数据域的值为x  
void InsertAtHead(Node* first, DataType x) {  
    Node* newNode = new Node(x); // 分配新节点内存并初始化数据域  
    newNode->next = first->next; // 将新节点的next指针指向原头结点的下一个节点  
    first->next = newNode;       // 更新头结点的next指针,指向新节点  
}  
  
// 注意:在实际应用中,你可能需要考虑内存释放的问题,例如在删除节点或销毁链表时。  
// 但在这个简单的例子中,我们没有涉及这些操作。  
  
int main() {  
    // 示例用法  
    Node* list = InitList();  
    InsertAtHead(list, 1);  
    InsertAtHead(list, 2);  
    InsertAtHead(list, 3);  
    PrintList(list); // 输出:3 2 1  
    return 0;  
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值