## 单链表 《数据结构》

本文介绍了单链表的基本操作,包括建立、清空、删除、输入、输出、查找、判断长度和判读是否为空等核心概念。
摘要由CSDN通过智能技术生成

单链表 《数据结构》

单链表的建立,清空, 删除,输入,输出,查找,判断长度,判读是否为空,


///单链表
#include <iostream>
#include <stdlib.h>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LinkNode;
void InitList(LinkNode *&L)///初始化
{
    L=(LinkNode *)malloc(sizeof(LinkNode));
    L->next=NULL;
}
bool ListInsert(LinkNode *&L,int i,ElemType e)///在地i个位置插入数据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=(LinkNode * )malloc(sizeof(LinkNode));
        s->data=e;
        s->next=p->next;
        p->next=s;
        return true;
    }
}
void DestroyList(LinkNode *&L)///销毁///功能好像没实现
{
    LinkNode * pre=L,* p=L->next;
    while(p!=NULL)
    {
        free(pre);
        pre=p;
        p=pre->next;
    }
    free(pre);///释放
    L=NULL;
}
void CreateListF(LinkNode *&L,ElemType a[],int n)///头插法创建
{
    LinkNode *s;
    L=(LinkNode *)malloc(sizeof(LinkNode));
    L->next=NULL;
    for(int i=0; i<n; i++)
    {
        s=(LinkNode * )malloc(sizeof(LinkNode));
        s->data=a[i];
        s->next=L->next;
        L->next=s;
    }
}
void CreateListR(LinkNode *&L,ElemType a[],int n)///尾插法建立单链表
{
    LinkNode *s,*r;
    L=(LinkNode *)malloc(sizeof(LinkNode));
    L->next=NULL;//创建头结点
    r=L;	//r始终指向终端结点,开始时指向头结点
    for (int i=0; i<n; i++)
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
        s->data=a[i];
        r->next=s;			//将结点s插入结点r之后
        r=s;
    }
    r->next=NULL;			//尾结点next域置为NULL
}
void DispList(LinkNode * L)///输出
{
    if(L==NULL)
    {
        cout << "此链表为空!";
        return;
    }
    LinkNode * p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);///这里是p->data,不是p->next(否则是地址)
        p=p->next;
    }
    printf("\n");
}
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);
}
int LocateElem(LinkNode *L,ElemType e)///按元素值e查找位置i
{
    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 GetElem(LinkNode *L,int i,ElemType &e)///数据存在,输出1,否则为0
{
    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;
    }
}
bool ListDelete(LinkNode *&L,int i,ElemType &e)///删除第i个位置的数据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)
        return false;
    else
    {
        q=p->next;
        if(q==NULL)
            return false;
        e=q->data;
        p->next=q->next;
        free(q);
        return true;
    }
}
int main()
{
    LinkNode *s1;

    int b[99],e;
    int n;
    cin >> n;
    for(int i=0; i<n; i++)
    {
        cin >> b[i];
    }
    CreateListF(s1,b,n);///头插法
    DispList(s1);

    /*int z=GetElem(s1,1,b[1]);
    cout << z << endl;
    int o=GetElem(s1,8,b[8]);
    cout << o << endl;

     ListDelete(s1,1,b[1]);///删除b[1]
   DispList(s1);
    int y=LocateElem(s1,b[2]);///正zhe数
    cout << y << endl;

    InitList(s1);///初始化为空
    DispList(s1);

    CreateListR(s1,b,n);///尾插发
    DispList(s1);
    int m=ListEmpty(s1);///panduan是否为空
    cout << m << endl;///输出为0,代表线性表不是空的,输出为1,代表是空链表

    InitList(s1);///初始化为空
    DispList(s1);
    int x=ListEmpty(s1);///panduan是否为空
    cout << x << endl;///输出为0,代表线性表不是空的,输出为1,代表是空链表

    int l=ListLength(s1);///长度
    cout << l << endl;
    ListInsert(s1,1,555);///在第一个位置插入5555
    DispList(s1);*/

    DestroyList(s1);
    DispList(s1);
    return 0;
}


来源:https://i.csdn.net/

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值