您的位置:首页 > 其它

线性表的顺序存储与链式存储

2017-06-26 20:23 253 查看
线性表的顺序存储

#include<iostream>
#include<cstdlib>
#include<iomanip>
using namespace std;
#define MaxSize 100
#define ElementType int
typedef struct LNode *List;
struct LNode{
ElementType data[MaxSize];
int Length;
}L;
List Ptr;
//初始化
List MakeEmpty()
{
List PtrL;
PtrL=(List)malloc(sizeof(struct LNode));
PtrL->Length=-1;
return PtrL;
}
//查找
int Find(ElementType X,List PtrL)
{
int i=0;
while(i<=PtrL->Length&&PtrL->data[i]!=X)
i++;
if(i>PtrL->Length)  return -1;
else return i;
}
//插入
void Insert(ElementType X,int i,List PtrL)
{
int j;
if(PtrL->Length==MaxSize-1)
{
cout<<"表满"<<endl;
return;
}
if(i<1||i>PtrL->Length+2)
{
cout<<"位置不合法"<<endl;
return;
}
for(j=PtrL->Length;j>=i;j--)
PtrL->data[j+1]=PtrL->data[j];
PtrL->data[i-1]=X;
PtrL->Length++;
return;
}
//删除
void Delete(int i,List PtrL)
{
int j;
if(i<1||i>PtrL->Length+1)
{
cout<<"不存在第"<<dec<<i<<"个元素"<<endl;
return;
}
for(j=i;j<=PtrL->Length;j++)
PtrL->data[j-1]=PtrL->data[j];
PtrL->Length--;
return;
}
//例子
int main()
{
int i,j;
Ptr=MakeEmpty();
for(i=0;i<10;i++)
{
Ptr->data[i]=2*i;
Ptr->Length++;
}
j=Find(4,Ptr);
cout<<j<<endl;
return 0;
}


线性表的链式存储

#include<iostream>
#include<cstdlib>
#include<iomanip>
using namespace std;
#define MaxSize 100
#define ElementType int
typedef struct LNode *List;
struct LNode{
ElementType data;
List next;
}L;

//初始化
List ListInit()
{
List PtrL;
PtrL=(List)malloc(sizeof(struct LNode));   //申请结点空间
if(PtrL==NULL){
cout<<"申请空间失败"<<endl;            //判断是否有足够的空间
}
PtrL->next=NULL;
return PtrL;
}
//头插法建立单链表(带头结点)
List ListCreat1()
{
List head;
head=ListInit();
ElementType x;

while(cin>>x){
List p;
p=(List)malloc(sizeof(struct LNode));
p->data=x;
p->next=head->next;
head->next=p;
}

return head;
}
//尾插法建立单链表(带头结点)
List ListCreat2()
{
List head;
head=ListInit();                    //初始化一个空链表
List r;
r = head;                           //r始终指向终端结点,开始时指向头结点
ElementType x;

while(cin>>x){
List p;
p=(List)malloc(sizeof(struct LNode));  //申请新的结点空间
p->data=x;                             //结点的数据域赋值
r->next=p;                             //将结点插入到表头head-->|1|-->|2|-->NULL
r=p;
}
r->next=NULL;

return head;
}
//求表长
int Length(List PtrL)
{
int j=0;
List p=PtrL;              //p指向表中的第一个结点
while(p)
{
j++;
p=p->next;
}
return j;
}
//查找
/*按序号查找*/
List FindKth(int K,List PtrL)
{
List p=PtrL;
int i=1;
while(p!=NULL&&i<K)
{
p=p->next;
i++;
}
if(i==K)  return p;     /*找到底K个元素,返回指针*/
else  return NULL;      /*否则返回空指针*/
}
/*按值查找*/
List Find(ElementType X,List PtrL)
{
List p=PtrL;
while(p!=NULL&&p->data!=X)
p=p->next;
return p;
}
//插入
/*不带头结点*/
List Insert(ElementType X,int i,List PtrL)
{
List p,s;
if(i==1)                       //新节点插在表头
{
s=(List)malloc(sizeof(struct LNode));
s->data=X;
s->next=PtrL;
return s;
}
p=FindKth(i-1,PtrL);
if(p==NULL){
cout<<"参数i错"<<endl;
return NULL;
}else{
s=(List)malloc(sizeof(struct LNode));
s->data=X;
s->next=p->next;           //新结点插在第i-1个结点后面
p->next=s;
return PtrL;
}
}
//删除
/*不带头结点*/
List Delete(int i,List PtrL)
{
List p,s;
if(i==1){                     //若要删除的是第一个结点
s=PtrL;
if(PtrL==NULL)  return NULL;
else  PtrL=PtrL->next;
free(s);
return PtrL;
}
p=FindKth(i-1,PtrL);         //查找第i-1个结点
if(p==NULL){
cout<<"第i-1个结点不存在"<<dec<<i-1<<endl;
return NULL;
}else  if(p->next==NULL){
cout<<"第i个结点不存在"<<dec<<i<<endl;
return NULL;
}else{
s=p->next;              //s指向第i个结点
p->next=s->next;        //删除结点
free(s);                //释放被删除结点
return PtrL;
}
}
//例子
int main()
{

9c78
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: