线性表的简单实现(顺序表、单链表)

顺序表的简单实现

#include<iostream>

#define MAXSIZE 100
 
#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW   -2

using namespace std;

typedef int Status;

typedef struct
{
	int *elem;//动态分配数组,int elem[MAXSIZE](静态分配数组) 
	int length;
}Sqlist;

Status InitList(Sqlist &L)
{//创建空表
    L.elem = new int[MAXSIZE];//C++
    //L.elem = (int *)malloc(sizeof(int)*MAXSIZE) //C
    if(!L.elem) exit(OVERFLOW);
	L.length = 0;
	return OK; 
}

Status GetElem(Sqlist L,int i,int &e)
{//取值
    if(i<1||i>L.length) return ERROR;
    e = L.elem[i-1];
    return OK;
}

Status LocateElem(Sqlist L,int e)
{//查找 
    for(int i=0;i<L.length;i++)
	  if(L.elem[i]==e) return i+1;
	return ERROR;   
}

Status ListInsert(Sqlist &L,int i,int e)
{//插入 
	if(i<1 || i>L.length+1)  return ERROR; 
	if(L.length==MAXSIZE)  return ERROR;  
	for(int j=L.length-1;j>=i-1;j--)
	    L.elem[j+1] = L.elem[j];
	L.elem[i-1] = e;
	++L.length;
	return OK;	  	
}

Status ListDelete(Sqlist &L,int i)
{//删除 
	if(i<1 || i>L.length) return ERROR; 
	for(int j=i;j<=L.length-1;j++)
	   L.elem[j-1]=L.elem[j];
	--L.length;
	return OK;      
}

void ClearList(Sqlist &L)
{//清空 
	L.length=0;
}

void DestroyList(Sqlist &L)
{//销毁 
	if(L.elem) delete L.elem;	 
}

Status ListLength(Sqlist L)
{
	return(L.length);
}

int main()
{
	int m,n,x,a,b,c,d,f,g,h,o,p,q; 
	cout <<"简单实现顺序表:"<< endl;
	
	cout << "------------------------------------------------" << endl;
	Sqlist L;
	m=InitList(L);
	if(m) 
	cout <<"顺序表创建成功!"<< endl;
	else
	cout <<"顺序表创建失败!"<<endl;
	
	cout << "------------------------------------------------" << endl;
	cout <<"请输入你想存储的个数n和n个数的值:";
	cin >> n;
	for(int i=1;i<=n;i++)
	{
		cin >> x;
		ListInsert(L,i,x);
	} 
	
	cout << "------------------------------------------------" << endl;
	cout <<"现在顺序表为:"<< endl;
	for(int i=0;i<L.length;i++) 
	{
		cout << L.elem[i]  <<" ";
	}
	cout << endl;
	
	cout << "------------------------------------------------" << endl;
    cout <<"请输入需要查找位置的值:";
	cin >> b;
	m = LocateElem(L,b);
	if(m)
	{
		cout << "查找成功!"<< endl;
		cout << "此值位置为:"<< m <<endl; 
	}
	else
	cout << "查找失败!"<<endl;
	
	cout << "------------------------------------------------" << endl;
    cout<<"请输入需要插入的值及位置:";
	cin >> c >> d;
	m=ListInsert(L,d,c);
	if(m)
	{
		cout <<"插入成功!"<<endl;
		cout <<"现在顺序表为:"<<endl;
		for(int i=0;i<L.length;i++)
		{
			cout << L.elem[i] <<" ";
		 } 
		 cout <<endl;
	}
	else
	cout << "插入失败!"<<endl;
	
	cout << "------------------------------------------------" << endl;
    cout <<"请输入需要删除第几个元素:";
	cin >> g;
	m = ListDelete(L,g);
	if(m)
	{
		cout <<"删除成功!"<<endl;
		cout<<"现在顺序表为:"<<endl;
		for(int i=0;i<L.length;i++)
		{
			cout << L.elem[i] <<" ";
		 } 
		cout << endl; 
    }	 
    else
    cout <<"删除失败!"<< endl;
	
	cout << "------------------------------------------------" << endl;
	cout <<"请输入需要你要查找的元素:";
	cin >> o;
	m=LocateElem(L,o);
	if(m)
	{
	cout <<"查找成功!"<<endl;
	cout <<"这个元素在这个位置:"<< m <<endl; 
	}
	else
	cout <<"查找失败!" <<endl;
	
	cout << "------------------------------------------------" << endl;
	cout <<"请输入你取第几个元素:";
	cin >> p;	
	m = GetElem(L,p,q);
	if(m)
    cout <<"这个元素是:"<< q <<endl; 
    else
    cout <<"位置不合法,取值失败!"<<endl;
    
    cout << "------------------------------------------------" << endl;
    cout <<"清空顺序表"<<endl;
    ClearList(L);
	cout<<"顺序表已清空!"<<endl;
    
    cout << "------------------------------------------------" <<endl;
	cout <<"销毁顺序表"<<endl;
	DestroyList(L);
	cout <<"顺序表已销毁!"<<endl;
}

在这里插入图片描述


单链表的简单实现

#include<iostream>

#define MAXSIZE 100
 
#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW   -2

using namespace std;

typedef int Status;

typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode,*LinkList;


Status InitList(LinkList &L)
{//初始化  
    L=new LNode;   //生成一个新结点作为头节点,用头指针L指向头节点
    L->next = NULL;  //头节点指针域置空
    return OK;
 }
 
void CreateList_H(LinkList &L,int n)
{//前插法 
    L=new LNode;
    L->next=NULL;   int m;     //先建立一个带头节点的空链表
    cout <<"输入这几个元素:"; 
    for(int i=0;i<n;++i)
    {
      LNode *p=new LNode;       //生成新结点*p
      cin >> m;     //输入元素值赋给新结点*p的数据域
      p->data=m;
      p->next=L->next; L->next=p;   //将新结点*p插入到头节点之后
    }
}    

void CreatList_R(LinkList &L,int n)
{//后插 
    L=new LNode;int m;
    L->next=NULL;       //先建立一个带头节点的空链表
    LNode*r=L;  
	cout <<"输入这几个元素:";               //尾指针r指向头节点
    for(int i=0;i<n;++i)
    {
       LNode*p=new LNode;
	   cin >>m;      //生成新结点
       p->data=m;   //输入元素值赋给新结点*p的数据域
       p->next=NULL;r->next=p;    //将新结点*p插入尾结点*r之后
       r=p;    //r指向新的尾结点*p
     }
}      

Status ListInsert(LinkList &L,int i,int e)
{//插入结点 
    LNode*p=L;int j=0;          //p指向头结点
    while(p&&(j<i-1))
    {
       p=p->next;++j;  //查找第i-1个结点,p指向该结点
     }
     if(!p||j>i-1)  return ERROR;   //i>n+1或i<1
     LNode*s=new LNode;      //生成新结点*s
     s->data=e;        //将结点*s的数据域置为e
     s->next=p->next;  //将结点*s的指针域指向结点a(i)
     p->next=s;        //将结点*p的指针域指向结点*s
     return OK;
}    

int ListLength_L(LinkList L)
{//求表长 
    LinkList p;  //或Lnode *p;
    p=L->next;   //p指向第一个结点
    int i=0;         //计数器i
    while(p)     //遍历单链表,统计结点数
    {
      i++;
      p=p->next;  //p指向下一个结点
     }
    return i; 
}  

Status LocateElem(LinkList L,int e)
{//按值查找 
    LNode*p=L->next;
	int j=1;       //p指向首元结点
    while(p&&p->data!=e)  //顺链向后扫描,直到p为空或p所指数据域=e
    { 
	p=p->next;   //p指向下一个结点
	j++; 
	}  
    return j;        //若查找成功返回e的结点地址p,查找失败p为NULL
 }
 
Status GetElem(LinkList L,int i,int &e)
{//取值 
     int j;
     LNode*p=L->next;j=1;  //p指向首元结点,计数器j=1
     while(p&&j<i)   
     {
       p=p->next;    //p指向下一个结点
       ++j;
      }
      if(!p||j>i)  return ERROR;   //i不合法i>n或i≤0
      e=p->data;       //取第i个结点的数据域
      return OK;
}       

Status ClearList(LinkList &L)
{//清空 
    LNode *p,*q;  //或LinkList p,q;
    p=L->next;
    while(p)      //非空,没到表尾
    {
      q=p->next;  //q指向p的下一个结点
      delete p;   //销毁p
      p=q;        //使p、q指向同一结点
     }
   L->next=NULL;  //将头节点指针域置为空
   return OK;  
}

Status ListDelete(LinkList &L,int i)
{//删除 
     LNode *p=L;int j=0;    
	 LNode *q;           //p指向头结点
     while((p->next)&&(j<i-1))
     {
       p=p->next;
       ++j;                //查找第i-1个结点,p指向该结点
      }
      if(!(p->next)||(j>i-1))  return ERROR;   //i>n或i<1时,删除位置不合理
      q=p->next;          //临时保存被删除结点的地址以备释放
      p->next=q->next;    //改变删除结点前驱结点的指针域
      delete q;           //释放删除结点的空间    
      return OK;
 }    
 
Status DestoryList_L(LinkList &L)
{//销毁 
     LinkList p;   //或Lnode *p;p为指针变量
     while(L)      //L非空 
     { 
        p=L;       //p、L指向同一结点
        L=L->next; //L指针指向下一个结点
        delete p;  //删除结点p
       } 
    return OK;   
}  

int main()
{
	LinkList L;int x;
	cout <<"单链表的简单实现:"<<endl<<endl;
	cout <<"初始化链表:"<<endl;
	x=InitList(L);
	if(x) 
	cout <<"初始化成功!"<<endl;
	else
	cout <<"初始化失败!" ;
	cout <<endl;
	
	cout <<"前插法创建单链表:"<<endl;
	cout <<"输入你想存入的元素个数:"; 
	int n;
	cin >> n;
	CreateList_H(L,n);
		
	cout <<"当前单链表元素为:"<<endl;
	for(int i=1;i<=ListLength_L(L);i++)
	{
		int a;
		GetElem(L,i,a);
		cout <<a<<" ";
	}
	cout<<endl<<endl;
	
	cout <<"后插法创建单链表:"<<endl;
	cout <<"输入你想存入的元素个数:"; 
	cin >> n;
    CreatList_R(L,n); 
    
    cout <<"当前单链表元素为:"<<endl;
	for(int i=1;i<=ListLength_L(L);i++)
	{
		int a;
		GetElem(L,i,a);
		cout <<a<<" ";
	}
	cout<<endl<<endl;
	
	int j,g;
	cout <<"输入你想插入的结点的位置和数值:";
	cin >> j>>g;
	x=ListInsert(L,j,g);
	if(x)
	cout <<"插入成功!"<<endl;
	else
	cout <<"插入失败!"<<endl; 
	cout<<endl;
	
	int y;
	cout<<"输入你想删除的元素的位置:";
	cin >> y;
	x=ListDelete(L,y);
	if(x)
	cout <<"删除成功!"<<endl;
	else
	cout <<"删除失败!"<<endl;
	cout <<endl;
	
	 cout <<"当前单链表元素为:"<<endl;
	for(int i=1;i<=ListLength_L(L);i++)
	{
		int a;
		GetElem(L,i,a);
		cout <<a<<" ";
	}
	cout<<endl<<endl;
	
	cout<<"此时表长为:"<<ListLength_L(L)<<endl<<endl; 
	
	int e,c;
	cout<<"输入你想取第几个值:";
	cin >>c;
	x=GetElem(L,c,e);
	if(x)
	{
	cout<<"取值成功!"<<endl;
	cout<<"该值为:"<<e<<endl;
	}
	else
	cout<<"取值失败"<<endl; 
	cout<<endl; 
	
	cout<<"输入想查找的值:";
	cin >>e; 
	cout<<"该值位置在:"<<LocateElem(L,e)<<endl<<endl; 
	
	cout <<"清空链表:"<<endl;
	if(ClearList(L))
	cout<<"已清除,"<<"现在的表长为:"<< ListLength_L(L)<<endl<<endl;
	
	cout<<"销毁链表:"<<endl;
	if(DestoryList_L(L))
	cout <<"已销毁!"<<endl;
	
	return 0;
	}    

在这里插入图片描述

发布了33 篇原创文章 · 获赞 81 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wmy0217_/article/details/104158991