第二期 C/C++数据结构 线性表 链表操作

 话不多谁直接上代码,尊重原创,谢谢~

#include <iostream>
using namespace std;

typedef struct Lnode {
    int data;    //结点数据域
    Lnode* next;    //结点指针域
}Lnode, * LinkList;  //LinkList为指向结构体Lnode的指针类型

//---------------------------------------------初始化参数
void InitList(LinkList& L) {
    L = new Lnode;  //开辟空间给新结点L
    L->next = NULL;  //为新结点的指针域置空
    cout << "初始化完成" << endl;

}

//---------------------------------------------链表初始(尾插法)插入操作
void CreateLink(LinkList& L, int n) {
    Lnode* p, * s;      //生成两个新指针
    s = L;              //将s指向链表L头结点
    for (int i = 1; i <= n; i++) {
        p = new Lnode;
        cout << "请输入第" << i << "个元素:";
        cin >> p->data; //输入元素
        s->next = p;    //将生成的p结点指向头结点的下一个(L->next)
        s = p;          //将L这个指针指向p结点,利用循环尾插发创建单链表
    }
    s->next = NULL;
}

//---------------------------------------------链表初始(头插法)插入操作
void InsertLink(LinkList& L, int n) {
    Lnode* p, * s;      //新定义头结点s和要头插法插入的结点p
    s = L;              //将s指向链表L头结点
    for (int i = 1; i <= n; i++){
        p = new Lnode;
        cout << "请输入要插入第"<<n-i+1<<"个元素" ;
        cin >> p->data; 
        p->next=s->next;    //将p->next结点指向s->next
        s->next = p;        //将头结点的下一个(s->next)指向p结点
    }
}

//---------------------------------------------链表查找指定元素,并且返回位置
void Getdata(LinkList& L, int c) {
    Lnode* p = new Lnode;           //生成新的指针
    p = L->next; int j=1;           //将p指针指向首元结点
    while (p && p->data != c) {     //判断如果首元结点存在并且值域不等于我要查找的值时继续循环
        p = p->next;                
        j++;                        //给次指针向下指一次,j就自增一次 
    }
    if (p->data==c){                //当值域和我要查找的元素相同时返回提示
        cout << "获取成功,您获取元素" << c << "的位置在链表的第" << j << "个。" << endl << endl;
    }
    else {
        cout << "抱歉,您要获取的内容不在链表里面!" << endl;
    }
}

//---------------------------------------------链表更新修改参数
void updateList(LinkList& L, int e) {
    Lnode* p = L;                 //生成新的指针
    int count = 0;                //count为了计数,找到我要修改的元素位置
    while (p->next != NULL) {     //判断当指针非空继续执行
        count++;                  
        p = p->next;              //指针向下移动一次,count自增一次
        while (count == e) {      //将修改的位置与查找的位置相同时,
            cout << "修改为:";
            int f; cin >> f;
            p->data = f;          //将结点的data赋值修改
            break;
        }
    }
}

//---------------------------------------------链表删除给定位置元素
void DeleteList(LinkList& L,int d) {
    Lnode* p = new Lnode;       //创建p,q指针
    Lnode* q = new Lnode;
    p = L;                      //将p指向链表L
    int j = 0;                  //j是为了找到要删除第d个的前一个元素
    while (p->next&&j<d-1){     //当p->next存在时(头指针下一个元素)并且要删除的元素位置长度大于查找的长度,
        p = p->next;            //才可以继续循环,将p指向p的next,并且j++增加长度
        ++j;
    }
    //如果p的下一个结点不存在,或者查询的长度已经大于要删除的元素位置,给出提示;
    if (!(p->next) && j > d - 1) cout << "删除失败~" << endl;
    q = p->next;                //否则将p-next赋个给q暂存
    p->next = q->next;          //将p->next指向下一个指针的下一个指针(q->next;)
    delete q;                   //最后删除q结点即可
    cout << "删除成功! ";
}

//---------------------------------------------链表的长度
void ListLength(LinkList L) {
    Lnode* p = L;               //生成新的指针
    int count = 0;              //count为了计数,来计算链表的长度
    while(p->next != NULL){     //当指针非空可以继续循环,直至指针指向空的结点时,长度不在增加
        count++;                
        p = p->next;
    }
    cout << count;
}

//---------------------------------------------链表取值&输出操作
void PrintList(LinkList& L) {
    Lnode* p = new Lnode;       //新生成一个结点p
    p = L;                      //将p指向链表L
    cout << "当前链表为:";
    while (p->next != NULL) {   //输出链表中元素判断依据:最后一个结点是空的时候跳出循环
        cout << p->next->data << " \t"; //取出头指针下一个结点的元素
        p = p->next;                    //让指针的下一个命名为p
    }
    cout << endl << endl;
}



int main() {
    LinkList L;         //定义一个链表L
    cout << "1.初始化操作";
    InitList(L);        //初始化操作

    cout << "2.请输入需要存取的元素的个数:";
    int a; cin >> a;
    CreateLink(L, a);   //尾插法插入操作

    PrintList(L);       //打印链表
    
    cout << "3.想利用头插法插入几个元素呢:";   //头插法输入打印
    int b; cin >> b;
    InsertLink(L, b);
    cout << "插入成功,";
    PrintList(L);

    cout << "4.获取操作,请出入你要获取位置的元素:";//获取制定元素位置
    int c; cin >> c;
    Getdata(L,c);

    cout << "5.删除操作,请出入你要删除的元素位置:";//删除给出相应位置的元素
    int d; cin >> d;
    DeleteList(L,d);
    PrintList(L);

    cout << "6.当前链表的长度为:";                  //获取当前链表的长度
    ListLength(L);

    cout << ",给您一次修改链表的机会,您想修改第几个:" ;//修改指定位置的元素
    int e; cin >> e;
    updateList(L,e);
    PrintList(L);
}

运行代码截图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵相机~

谢谢你,调试、讲解私聊我~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值