数据结构学习之单链表基本操作

数据结构学习之单链表基本操作

0x1 前言

今天实验课,学习了下单链表的写法,这里记录下。

0x2 正文

题目要求如下:
本实验的单链表元素的类型为char,完成如下实验要求:

(1)初始化单链表h

(2)采用尾插法依次插入a、b、c、d、e

(3)输出单链表h

(4)输出单链表h的长度

(5)判断单链表h是否为空

(6)输出单链表h的第3个元素

(7)输出元素a的逻辑位置

(8)在第4个元素位置上插入元素f

(9)输出单链表h

(10)删除单链表h的第3个元素

(11)输出单链表h

(12)释放单链表h

#include <iostream>
#include <cstdio>
#include <cstdlib>

typedef char ElemType;
using namespace std;

typedef struct LNode
{
    ElemType data; //存放元素值
    struct LNode *next; //指向后继结点
}LinkNode;

//初始化单链表
void InitList(LinkNode * &h)
{
    h=(LinkNode *)malloc(sizeof(LinkNode));
    h->next=NULL; //创建头结点,其next域置为NULL
}

//尾插法插入元素
void CreateListR(LinkNode * &h,ElemType a[],int n)
{
    LinkNode *s,*r;
    r=h;
    for(int i=0;i<n;i++)
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=NULL;
}

// 输出线性表
void DispList(LinkNode *h)
{
    LinkNode *p=h->next;
    while(p!=NULL)
    {
        printf("%c",p->data);
        p=p->next;
    }
    printf("\n");
}

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

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

//输出指定下标的元素
char LocateElemByIndex(LinkNode *h,int i)
{
    LinkNode *p=h;
    while(p->next!=NULL&&i)
    {
        i--;
        p=p->next;
    }
    if(p->next==NULL)
        return(false);
    else
        return(p->data);
}

// 输出指定元素的位置
int LocateElem(LinkNode *h,ElemType e)
{
    int i=1;
    LinkNode *p=h->next;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
        i++;
    }
    if(p==NULL)
        return(0);
    else
        return(i);
}

//在指定位置上插入指定的元素
bool ListInsert(LinkNode *h,int i,ElemType e)
{
    int j=0;
    LinkNode *p=h,*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;
    }
}

//删除指定下标的元素
bool ListDelete(LinkNode * &h,int i,ElemType &e)
{
    int j=0;
    LinkNode *p=h,*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;
        p->next=q->next;
        free(q);
        return true;
    }
}

//释放单链表h
void DestroyList(LinkNode *&h)
{
    LinkNode *pre=h,*p=h->next;
    while(p!=NULL)
    {
        free(pre);
        pre=p;
        p=pre->next;

    }
    free(pre);
    cout<< "List has been destroyed!"<<endl;
}
int main()
{
    LinkNode *h;
    char e;
    InitList(h);
    char a[5]={'a','b','c','d','e'};
    CreateListR(h,a,5);
    DispList(h);
    cout<< ListLength(h) <<endl;
    if(ListEmpty(h))
    {
        cout<< "List is Empty!"<<endl;
    }else
    {
        cout<<"List isn't Empty!"<<endl;
    };
    cout<< LocateElemByIndex(h,3)<<endl;
    cout<< LocateElem(h,'a')<<endl;
    ListInsert(h,4,'f');
    DispList(h);
    ListDelete(h,3,e);
    DispList(h);
    DestroyList(h);
    return 0;
}

运行结果如下图:
image-20190326000315437

0x3 总结

感觉自己写单链表还不是很熟练,争取能多抽出点时间去好好学习数据结构,come on!

猜你喜欢

转载自www.cnblogs.com/xq17dog/p/10597768.html