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

学习目标:

掌握单链表的基本操作。


学习内容:

  1. 单链表的定义
  2. 使用头插法建立单链表(读入数据的顺序与链表中的顺序相反)
  3. 使用尾插法建立单链表(读入数据的顺序与链表中的顺序相同)
  4. 按序号查找结点值
  5. 按值查找结点
  6. 插入结点(按照位序)
  7. 删除节点(按照位序)
  8. 求单链表的表长

学习产出:

  • CSDN 技术博客 1篇
  • 代码
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    
    typedef struct LNode{
        int data;    //数据域
        struct LNode *next;    //指针域
    }LNode, *LinkList;
    
    void List_Head(LinkList &L,int n){   //逆向建立单链表
        LNode *s;
        L=(LinkList)malloc(sizeof(LNode));
        int x;
        L->next=nullptr;
        for(int i=0;i<n;i++){
            s=(LNode*)malloc(sizeof(LNode));
            scanf("%d",&x);
            s->data=x;
            s->next=L->next;
            L->next=s;
        }
        return;
    }
    
    void List_Tail(LinkList &L, int n){   //正向建立单链表
        int x;
        L=(LinkList)malloc(sizeof(LNode));
        L->next=nullptr;
        LNode *s,*r=L;
        for(int i=0;i<n;i++){
            s=(LNode*)malloc(sizeof(LNode));
            scanf("%d",&x);
            s->data=x;
            r->next=s;
            r=s;
        }
        r->next=nullptr;
        return;
    }
    
    LNode *GetElem(LinkList L, int i){  //按序号查找结点
        int j=1;  //表示p指向第几个结点
        LNode *p=L->next;   //指向第一个结点
        if(i == 0) return L;
        if(i < 1) return nullptr;
        while(p!=nullptr && j<i){
            p=p->next;
            j++;
        }
        return p;
    }
    
    LNode *LocateElem(LinkList L, int e){   //按值查找结点
        LNode *p=L->next;  //指向第一个结点
        while(p!=nullptr && p->data!=e){
            p=p->next;
        }
        return p;
    }
    
    bool ListInsert(LinkList &L, int i, int e){  //按位序插入
        if(i<1) return false;
        LNode *p;
        int j=0;  //p指向的是第几个结点
        p=L;
        while(p && j<i-1){
            p=p->next;
            j++;
        }
        if(p == nullptr) {  //i值不合法
            return false;
        }
        LNode *s=(LNode *)malloc(sizeof(LNode));
        s->data=e;
        s->next=p->next;
        p->next=s;
        return true;
    }
    
    bool ListDelete(LinkList &L, int i, int &e){   //按位序删除
        if(i<1) return false;
        LNode *p;
        int j=0;  //当前P指向的是第几个结点
        p=GetElem(L,i-1);
        if(p == nullptr) return false;
        LNode *q=p->next;   //q指向被删除结点
        e=q->data;
        p->next=q->next;
        free(q);
        return true;
    }
    
    int ListLength(LinkList L){
        LNode *p=L->next;
        int length=0;
        while(p != nullptr){
            length++;
            p=p->next;
        }
        return length;
    }
    
    void DisplayList(LinkList L){  //显示线性表
        LinkList p=L->next;
        cout<<"线性表为:";
        while(p){
            cout<<p->data<<" ";
            p=p->next;
        }
        cout<<endl;
        return;
    }
    
    int main()
    {
        LinkList L;
        int n;
        cin>>n;
        List_Tail(L,n);
        DisplayList(L);
        int i,j;
        cout<<"输入要查找的序号值:";
        cin>>i;
        LNode *p=GetElem(L,i);
        cout<<p->data<<endl;
        cout<<"输入要查找的结点值:";
        cin>>j;
        LNode *q=LocateElem(L,j);
        if(q)  cout<<q->data<<endl;
        else cout<<"该值不存在"<<endl;
        cout<<"输入要插入的位序和值:";
        cin>>i>>j;
        bool b=ListInsert(L,i,j);
        if(b) DisplayList(L);
        else cout<<"输入的位序不合法!"<<endl;
        cout<<"输入要删除的位序:";
        int e=-1;
        cin>>i;
        bool b1=ListDelete(L,i,e);
        if(b1){
            cout<<e<<endl;
            DisplayList(L);
        }
        else{
            cout<<"输入的位序不合法!"<<endl;
        }
        int ListL=ListLength(L);
        cout<<"线性表的长度为:"<<ListL<<endl;
        return 0;
    }
    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值