数据结构单链表完整代码(无水货,完全可运行)

先给大家介绍一下功能目录,因为各功能名字比较长所以列举在开头:

(当然也是为了规范起名)

InitList(&L):初始化线性表,构造一个空的线性表;
DestoryList(&L):销毁线性表,释放为线性表L分配的内存空间;
ListEmpty(L):判断线性表是否为空表并返回真假;
ListLength(L):求出线性表长度,返回L中元素个数;
DispList(L):输出线性表,当线性表L不为空的时候顺序输出L中个元素的值;
GetElem(L):按照序号求线性表中元素,用e返回L中第i个元素的值;
LocateElem(L,e):按照元素值查找,返回L中第一个值为e的序号;
ListInsert(&L,i,e):插入元素,在L的第i个位置插入一个新元素e;
ListDelete(&L,i,&e):删除元素,删除L的第i个元素,并用e返回;
 

完整代码如下,代码中掺杂有注释:

接下来就是SHOW TIME:

#include<iostream>

using namespace std;

typedef int ElemType;

//定义类型;

struct LinkNode{
    ElemType data;
    LinkNode *next;
};//创造节点,前期准备工作;定义了一个数据成员data和一个向下的指针;

//创建一个单链表//头插法
void CreatListF(LinkNode *&L,ElemType a[],int n)
{
    LinkNode *s;//声明了一个名为 s 的指向 LinkNode 结构体的指针。也就是说,变量 s 可以指向一个链表节点
    L=new LinkNode;//创建一个指向链表头结点的新结点L;
    L->next=NULL;
    for(int i=0;i<n;i++){
        s=(LinkNode *)malloc(sizeof(LinkNode));//声明一个新结点且前文强调了指向LinkNode;
        //并且可以将这个替换为s=new LinkNode;
        s->data=a[i];
        s->next=L->next;
        L->next=s;
    }
}

//初始化链表
void InitList(LinkNode *&L){
    L=new LinkNode;
    L->next=NULL;
}

//销毁线性表; 
void DestoryList(LinkNode *&L){
    LinkNode *pre=L,*p=L->next;
    while(p!=NULL){
        free(pre);
        pre=p;
        p=pre->next;
    }
    free(pre);//free 函数只能用于释放通过 malloc 或 calloc 分配的堆内存,如果链表节点是使用 new 运算符进行分配的。正确的做法是使用 delete 运算符来释放节点的内存。
    //释放内存
}

//判断线性表是否为空表
bool ListEmpty(LinkNode *L){
    return(L->next==NULL);
}

//返回线性表长度
int ListLength(LinkNode *L){
    int n=0;
    LinkNode *p=L;
    while(p->next!=NULL){
        n++;
        p=p->next;
    }
    return(n);
}

//输出线性表
void DispList(LinkNode *L){
    LinkNode *p=L->next;
    while(p!=NULL){
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<"\n";
}

//按照序号求线性表中元素
bool GetElem(LinkNode *L,int i,ElemType &e){
    int j=0;
    LinkNode *p=L;
    if(i<=0)return false;
    while(j<i&&p!=NULL){
        j++;
        p=p->next;
        
    }
    if(p==NULL){
        return false;
        
    }else{
        e=p->data;
        return true;
    }
}

//按照元素值查找
int LocateElem(LinkNode *L,ElemType e){
    int i=1;
    LinkNode *p=L->next;
    while(p!=NULL&&p->data!=e){
        p=p->next;
        i++;
        
    }
    if(p==NULL){
        return(0);
    }else{
        return(i);
    }
}

//插入元素
bool ListInsert(LinkNode  *&L,int i,ElemType e){
    int j=0;
    LinkNode *p=L,*s;
    if(i<=0)return false;
    while(j<i-1&&p!=NULL){
        j++;
        p=p->next;
        
    }
    if(p==NULL){
        return false;
    }else{
        s=new LinkNode;
        s->data=e;
        s->next=p->next;
        p->next=s;
        return true;
    }
}

//删除数据元素;
bool ListDelete(LinkNode *&L,int i,ElemType &e)//这里的e是为了得到删除元素的值便于后续操作,当然也可以把ElemType &e删去
{
    int j=0;
    LinkNode *p=L,*q;
    if(i<=0)return false;
    while(j<i-1&&p!=NULL){
        j++;
        p=p->next;
    }
    if(p==NULL||p->next==NULL){
        return false;
    }else{
        q=p->next;
        e=q->data;
        p->next=q->next;
        if(q==NULL){
            return false;
        }
        free(q);
        return true;
    }
}

int main()
{
    
    LinkNode *list=NULL;//建立一个名为list的单链表,并使其初始化为空;
    ElemType arr[]={1,5,7,96,3,54,6,65,88};
    int length=sizeof(arr)/sizeof(arr[0]);
    CreatListF(list,arr,length);//将arr数组里的数据插入单链表里
    
    DispList(list);
    
    int m=ListLength(list);
    cout<<m<<"\n ";
    
    cout<<ListEmpty(list)<<"\n";
    
    ElemType e;
    cout<<GetElem(list,100,e)<<"\n";
    
    cout<<LocateElem(list,54)<<"\n";
    
    ListInsert(list,5,77);
    
    DispList(list);
    
    ListDelete(list,3,e);
    
    DispList(list);
    
    DestoryList(list);
    
    return 0;
    
}

复制即可用,希望能够帮助学习代码编程的你!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值