02.C语言单链表的创建、遍历、查找、清空、删除、修改、退出

//输入输出头函数
#include<iostream>

using namespace std;

#define OK 1;
#define ERROR 0;
#define OVERFLOW -2;
typedef int Elemtype;


/**
 * 单链表的存储结构
 */
typedef struct LNode {
    Elemtype data;
    struct LNode *next;
} LNode, *LinkList;


/**
 * 尾插法创建单链表
 */
void CreateList_R(LinkList &L, int n) {
    LNode *r, *p;
    //构建一个空的单链表L
    //生成新结点作为头结点,用头指针L指向头结点
    L = new LNode();
    //头指针指针域置空
    L->next = NULL;
    //尾指针r指向头结点
    r = L;
    for (int i = 0; i < n; i++) {
        //生成新结点
        p = new LNode();
        //输入元素值赋给新结点*p的数据域
        cout << "请输入要插入的整型数据:" << endl;
        cin >> p->data;
        p->next = NULL;
        r->next = p;
        r = p;
    }
    cout << "输入完成!!" << endl;
}


/**
 * 遍历输出单链表
 */
void ErgodicList(LinkList &L) {
    LNode *p;
    p = L->next;
    if (p == NULL) {
        cout << "此链表为空" << endl;
    }
    while (p) {
        cout << p->data << endl;
        p = p->next;
    }
}

/**
 * 查找指定结点
 */
LNode *LocateElem(LinkList &L, Elemtype e) {
    LNode *p;
    //初始化,p指向首元结点
    p = L->next;
    while (p && p->data != e) {
        p = p->next;
    }
    //查找成功返回值为e的结点地址p,查找失败返回NULL
    return p;
}

/**
 * 清空单链表
 */
void EmptyList(LinkList &L) {
    LNode *p;
    while (L->next) {
        p = L->next;
        L->next = p->next;
        delete p;
    }
    cout << "链表清除成功!" << endl;
}

/**
 * 删除指定结点
 */
void DeleteList(LinkList &L) {
    LNode *p;
    LNode *q;
    p = L;
    int temp;
    cout << "请输入要删除的结点" << endl;
    cin >> temp;
    while (p->next && p->next->data != temp) {
        p = p->next;
    }
    if (!p->next) {
        cout << "单链表中没有此结点数据!" << endl;
    } else {
        q = p->next;
        p->next = q->next;
        free(q);
        cout << "此结点数据删除成功!!" << endl;
    }
}

/**
 * 修改指定结点
 */
void ChangeList(LinkList &L) {
    LNode *p;
    p = L;
    int a, b;
    cout << "请输入要修改的结点" << endl;
    cin >> a;
    while (p->next && p->next->data != a) {
        p = p->next;
    }
    if (!p->next) {
        cout << "此单链表中没有要修改的数据" << endl;
    } else {
        cout << "请输入要将此结点修改为何值" << endl;
        cin >> b;
        p->next->data = b;
        cout << "数据修改成功!!" << endl;
    }

}

void OutPut() {
    LNode *L;
    int choose = 0;
    printf("1:创建或者添加链表结点数据\n");
    printf("2:遍历链表\n");
    printf("3:查找指定结点\n");
    printf("4:链表清空\n");
    printf("5:删除指定结点\n");
    printf("6:修改指定结点\n");
    printf("0:退出当前操作\n");
    while (1) {
        printf("请输入你要选择的功能前的序号:");
        cin >> choose;
        if (choose == 0) {
            cout << "系统退出成功" << endl;
            break;
        }
        switch (choose) {
            case 1: {
                int n;
                cout << "请输入要插入的整型的数量:" << endl;
                cin >> n;
                CreateList_R(L, n);
                break;
            }
            case 2: {
                ErgodicList(L);
                break;
            }
            case 3: {
                Elemtype e;
                LNode *s;
                cout << "请输入要查找的数据:" << endl;
                cin >> e;
                s = LocateElem(L, e);
                if (s == NULL) {
                    cout << "该单链表没有此数据" << endl;
                } else {
                    cout << "查找完成,要查找的数据的结点地址为:"
                         << s
                         << endl;
                }
                break;
            }
            case 4: {
                EmptyList(L);
                break;
            }
            case 5: {
                DeleteList(L);
                break;
            }
            case 6: {
                ChangeList(L);
                break;
            }
        }
    }
}

int main() {
    OutPut();
    return 0;
}



  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值