数据结构学习之单链表基本操作
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;
}
运行结果如下图:
0x3 总结
感觉自己写单链表还不是很熟练,争取能多抽出点时间去好好学习数据结构,come on!
原文地址:https://www.cnblogs.com/xq17dog/p/10597768.html
时间: 2024-10-11 20:50:45