C++链表实现( 数据结构 易)

楼主编程小白一个 最近在学数据结构,分享下自己的链表学习代码,欢迎大家指教和讨论。
如有不懂,也欢迎提问,不过我真是菜鸡一个哈哈。

#include<iostream>
#include<malloc.h>
using namespace std;
typedef int ElementType;
typedef struct LNode *List;           //结构体指针

struct LNode
{
    ElementType data;
    List next;
};
List L;

List MakeEmpty();           //初始化链表
int Length(List L);        //遍历链表求链表的长度
List Findk(int k, List L);   //按序号查找
int FindX(ElementType X, List L);   //按值查找
List Insert(ElementType X, int i, List L);   //讲X插入到i-1个结点之后
bool Delete(int i, List L);  //删除第i个结点
void print(List L);    //输出链表元素

List MakeEmpty() {
    List L = new LNode;
    L = NULL;
    return L;
}

//求表长
int Length(List L) {
    List p = L;            //指向链表头结点;
    int len = 0;
    while (p) {
        p = p->next;
        len++;
    }
    return len;
}

//按序查找
List Findk(int k, List L) {
    List p = L;
    int i = 1;
    while (p && i < k) {
        p = p->next;
        i++;
    }
    if (i == k)                     //注意K可能是负数也是输入错误
        return p;
    else
        return NULL;
}

//按值查找
int FindX(ElementType X, List L) {
    List p = L;
    int count = 1;
    while (p && p->data != X){
        p = p->next;
        count++;
    }
    return count;
}

//插入
List Insert(ElementType X, int i, List L) {
    List tmp, p;
    tmp = new LNode;
    tmp->data = X;
    if (i == 1) {
        tmp->next = L;
        return tmp;        //返回新表头
    }
    else {
        //查找位序为i-1的结点看是否在内
        p = Findk(i - 1, L);
        if (p == NULL) {
            cout << "插入未知参数错误" << endl;
            delete tmp;
            return NULL;
        }
        else {
            tmp->next = p->next;
            p->next = tmp;
            return L;   //返回表头
        }
    }    
}

//删除第i个结点
bool Delete(int i, List L) {
    List tmp, p;
    if (i == 1){
        tmp= L;
        if (L != NULL)L = L->next;
        else return NULL;
        delete tmp;
        return true;
    }
    p = Findk(i - 1, L);
    if (p == NULL) {
        cout << "第" << i - 1 << "个结点不存在,删除失败" << endl;
        return false;
    }
    else if (p->next == NULL) {
        cout << "第" << i << "个结点不存在,删除失败" << endl;
        return false;
    }
    else {
        tmp = p->next;
        p->next = tmp->next;
        delete tmp;
        return true;
    }
}

//输出链表元素
void print(List L) {
    int count = 0;
    while (L) {
        cout << L->data << "->";
        L = L->next;
        count++;
    }
    cout << endl;
    if (count == 0) {
        cout << "无数据输出" << endl;
    }
}

int main()
{
    List tmp;
    L = MakeEmpty();

    L = Insert(1, 1, L);
    L = Insert(2, 2, L);
    L = Insert(3, 3, L);
    L = Insert(4, 4, L);
    L = Insert(5, 5, L);

    print(L);
    int length = Length(L);
    cout << "该链表的长度为" << length << endl; 

    int i; cout << "请输入你想搜寻的位置下标:  ";
    cin >> i; 
    tmp = Findk(i, L);
    cout << "第"<<i<<"个下标对应的值为" << tmp->data << endl;

    int x; cout << "请输入你想搜寻的元素的值:  ";
    cin >> x;
    int q = FindX(x,L);
    cout << "元素" << x << "在链表的位置是: " << q << endl;

    int j; cout << "请输入你想删除的元素位置: ";
    cin >> j;
    if (Delete(j, L)){
        cout << "删除后的链表为: ";
        print(L);
    }
}

原文链接: https://www.cnblogs.com/Hsiung123/p/13110008.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++链表实现( 数据结构 易)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/338804

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午11:46
下一篇 2023年3月1日 下午11:46

相关推荐