#include<iostream>
using namespace std;
//定义单链表;结点内容为“学号”“姓名”“成绩”
//预定义常量和类型
#define TURE 1;
#define FALSE 0;
#define OK 1;
#define ERROR 0;
#define INFEASIBLE -1;
#define OVERFLOW -2;
typedef int ElemType;
typedef struct Lnode
{
ElemType data;//数据域
struct Lnode *next; //指针域;
} Lnode,*LinkList;
typedef int status;
//初始化;
status initList_L(LinkList &L)
{
L=new Lnode;
L->next=NULL;
return OK;
}
//判断链表是否为空;
status isEmpty(LinkList l)
{
if(l->next)
{
return FALSE;
} else
{return TURE;}
}
//销毁链表,头结点头指针结点都销毁 niubi666wodebaobei
status destroyList(LinkList &L)
{
Lnode *p;
while(L)
{
p=L;
L=L->next;
delete p;
}
if(L==NULL)
{
return OK;
} else return FALSE;
}
//清空单链表 (链表依然存在,但是链表没有元素
//1,依次释放所有结点,2,将头结点的指针域设置为空;
status clearList(LinkList &L)
{
Lnode *p;
p=L->next;
Lnode *q;
while (p)
{
q=p->next;
delete p;
p=q;
}
L->next =NULL;
return OK;
}
//求链表的表长;
int linkList_length(LinkList L)
{
int length=0;
Lnode *p;
p=L->next;
while(p)
{
length ++;
p=p->next;
}
return length;
}
//找单链表中的第i个元素;
//链表不是随机存取的
//ElemType selectLinklist(LinkList L,int i)//i>=1&&i<=L.length;
//{
// if(linkList_length(L)<i||i<=0)
// {
//
// break;
// }
// int j=0;
// Lnode *p;
// p=L-> next;
// while (p) //优化,while(p&&j<i)
// {
// j++;
// if(j==i)
// {
// return p->data;
// break;
// }
// p=p->next;
// }
//}
status getELem_L(LinkList L,int i,ElemType &e)
{//通过变量e返回第i个元素的值;
Lnode *p;
p=L->next;
int j=1;
while (p&&j<i)//向后扫描,直到p为空或者,p指向第i个元素;
{
p=p->next;
j++;
}
if(p==NULL|| j>i)
{
return ERROR;
}
e=p->data; //取第i个元素;
return OK;
}
//按值查找,根据指定数据查找该数据的位置,
/*status valueSelect(LinkList L,ElemType data,int &i)
{
Lnode *p=L->next;
i=1;
while (p)
{
if((p->data)==data)
{
break;
}
p=p->next;
i++;
}
//return INFEASIBLE;//找不到;
} */
Lnode * LocateElem_L(LinkList L,ElemType e)
{
Lnode *p;
p=L->next;
while (p&&p->data!=e) //到最后一个或找到时停止循环
{
p=p->next;
}
return p;
}
//按值查找,找到后返回序号。
int locateElem_L(LinkList L,ElemType e)
{
Lnode *p;//结点指针
p=L->next;//p指向首元结点
int j=1;
while (p&&p->data!=e)
{
j++;
p=p->next;
}
if(p==NULL)
{return 0;}
else return j;
}
//插入新的结点e
status insertLinkList (LinkList &L,ElemType e,int i)
{//i=1就是首元节点;
Lnode *p;
p=L->next;
int j=1;
//遍历找第i-1个节点;
while (p&&j<i-1)// 循环结束的条件是,p为空指针,或,节点指针直到第i-1个元素
{
p=p->next;
j++ ;
}
if(!p||j>i)
return ERROR;
LinkList s=new Lnode;//生成新的节点;
s->data=e;
s->next=p->next;
p->next=s;
}
//删除第i个元素
status deleteElemDefe (LinkList &L,int i)
{
Lnode *p,*q;
p=L->next;
int j=1;
while(p&&j<i-1)
{
j++;
p=p->next;
}
if(!p||j>i)
q=p->next;//留一下,被删元素,待delete
p->next=p->next->next;
delete q;
}
//单链表的建立——头插法
void setLinkList (LinkList &L,int n)
{
L=new Lnode; //生成头节点
L->next=NULL;
for(int i=n;i>0;i--)
{
Lnode *p;
p=new Lnode;
cin>>p->data;
p->next =L->next;
L->next=p;
}
}
//尾插法
//需要一个尾指针;
void setElemType (LinkList &L,int n)
{
L=new Lnode;
L->next =NULL;
Lnode *r;
r=L;
for (int i=0;i<n;i++)
{
Lnode *p;
p=new Lnode;
cin<<p->data;
p->data=NULL;
r->next=p;
r=p;
}
}
int main( ){
LinkList L;
initList_L(L);
}
}
链表新11235525
于 2022-09-17 20:46:28 首次发布