#include <iostream>
using namespace std;
typedef struct LNode //定义单链表
{
int data;
struct LNode *next;//为了指向后继节点
} LinkNode;
//线性表的初始化
void InitList(LinkNode *&L)
{
L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=NULL;
}
//销毁线性表
void DestoryList(LinkNode *&L)
{
LinkNode *pre=L,*p=L->next ;
while(p!=NULL)
{
free(pre);
pre=p;
p=p->next ;
}
free(pre);
}
//判断线性表是否为空
bool EmptyList(LinkNode *L)
{
return (L->next ==NULL);
}
//求线性表的长度
int Listlength (LinkNode *&L)
{
int length=0;
//L=(ListNode*)malloc(sizeof(LinkNode));
LinkNode *s=L;
while(s->next !=NULL)
{
length++;
s=s->next ;
}
return length;
}
//输出线性表
void DispList(LinkNode *L)
{
LinkNode *s=L->next;
while(s !=NULL)
{
cout<<s->data<<"->" ;
s=s->next ;
}
}
//求某个元素在单链表中的位置 ,因为如果这个元素不在链表中,就要返回假,所以用bool类型
bool GetElem(LinkNode *L,int i,int &e)
{
int j=0;
LinkNode *s=L;
while(j<i&&s!=NULL) //如果s=NULL说明没有元素了 而且如果用s->next 作为条件的话,那么到达最后一个元素的时候并不会判断,因为下一个元素为空直接跳出循环
{
j++;
s=s->next;
}
if(s==NULL)
return false;
else
{
e=s->data;
return true;
}
}
//头插法 倒序插入
void CreateListF(LinkNode *&L,int a[],int n)
{
LinkNode *s;
int i;
L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=a[i];
s->next =L->next ; //s指向L的next
L->next =s;
}
}
//尾插法 正序插入
void CreateListR(LinkNode *&L,int a[],int n)
{
LinkNode *r,*s;
int i;
L=(LinkNode*)malloc(sizeof(LinkNode));
r=L;//r始终指向尾结点
for(i=0;i<n;i++)
{
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=a[i];
r->next=s;
r=s;
}
r->next =NULL;
}
//插入数据元素
bool ListInsert(LinkNode *&L,int i,int e)
{ int j=0;
LinkNode *p=L,*s;
while (j<i-1 && p!=NULL)
{ j++;
p=p->next;
}
if (p==NULL) //未找到第i-1个结点,返回false
return false;
else //找到第i-1个结点p,插入新结点并返回true
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=e; //创建新结点s,其data域置为e
s->next=p->next; //将s插入到p之后
p->next=s;
return true;
}
}
//删除某个数据元素
bool ListDelete(LinkNode *&L,int i,int &e)
{ int j=0;
LinkNode *p=L,*q; //p指向头结点,j置为0
while (j<i-1 && p!=NULL) //查找第i-1个结点
{ j++;
p=p->next;
}
if (p==NULL) //未找到第i-1个结点,返回false
return false;
else //找到第i-1个结点p
{ q=p->next; //q指向第i个结点
if (q==NULL) //若不存在第i个结点,返回false
return false;
e=q->data;
p->next=q->next; //从单链表中删除q结点
free(q); //释放q结点
return true; //返回true表示成功删除第i个结点
}
}
int main()
{
LinkNode *L;
int a[10]={1, 8, 9, 8, 6, 15, 3, 36, 13, 16};
InitList(L);
CreateListF(L,a,10);
DispList(L);
cout<<endl;
CreateListR(L,a,10);
DispList(L);
cout<<endl;
cout<<Listlength(L)<<endl;
return 0;
}
数据结构中对单链表的操作
猜你喜欢
转载自blog.csdn.net/delete_bug/article/details/105375729
今日推荐
周排行