单链表 《数据结构》
单链表的建立,清空, 删除,输入,输出,查找,判断长度,判读是否为空,
///单链表
#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;
}