单链表的基本操作

来源:互联网 发布:好声音网络主播 编辑:程序博客网 时间:2024/06/07 20:52

#define OK 1
#define ERROR 0
#define OVERFLOW -2

//-------------单链表的存储结构--------//

typedef struct LNode{
ElemType  data;//结点的数据域 
struct LNode*next;//结点的指针域 
}LNode,*LinkList;// LinkList为指向结构体 LNode的指针类型 





//---------------单链表初始化----------//

Status  InitList(LinkList &L){//构造一个空的单链表L 
L = new LNode;//生成新结点作为头结点
L->next=NULL;//头结点指针域为空
    return OK; 
}




//-------------单链表的取值-----------//

Status  GetElem(LinkList L,int i,ElemType &e){

//在带头结点的单链表L中查找第i个元素
    LinkList p;
p=L->next;//初始化,p指向首元结点 
int j=1;//计数器j赋初值为1 
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i) retrun ERROR;//i>n或i<=0 
e=p->data;
    return OK; 
}//平均时间复杂度为O(n)




//-------------------单链表的查找--------------//

LNode *LocateElem_L(LinkList L,ElemType e){
//在带头结点的单链表L中查找值为e的元素
LNode *p;
p=L->next;
while(p&&p->data!=e)
p=p->next; //寻找满足条件的结点
return p; //返回L中的值为e的数据元素的位置,查找失败返回NULL
}//平均时间复杂度为O(n)//LocateElem_L




//---------------------单链表的插入----------------//

Status ListInsert_L(LinkList &L,int i,ElemType &e){
//在带头结点的单链表L中第i个位置之前插入元素e
int j;
LNode *p,*s;
p=L;//这样赋值可以将删除第一个结点统一考虑

        j=0;
while(p && j<i-1){p=p->next;++j;}//寻找第i-1个结点
if(!p||j>i-1) return ERROR; //i大于表长+1或者小于1
s=new LNode; //生成新结点s
s->data=e; //将结点s的数据域置为e
s->next=p->next;//将结点s插入L中
p->next=s;
return OK;
}//平均时间复杂度为O(n)






//---------------------单链表的删除-----------------//

Status ListDelete_L(LinkList &L,int i,ElemType &e){
//在带头结点的单链表L中,删除第i个位置,并由e返回值
LNode *p,*q;
int j;
p=L;j=0;
while(p->next && j<i-1){p=p->next;++j;}//寻找第i-1个结点
if(!(p->next) || j>i-1)return ERROR; //i大于表长+1或者小于1
q=p->next; //临时保存被删结点的地址以备释放
p->next=q->next;//改变删除结点前驱结点的指针域
e=q->data; //保存删除结点的数据域
delete q; //释放删除结点的空间
return OK;
}//平均时间复杂度为O(n)



//-----------------------前插法创建单链表-------------//

void CreateList_F(LinkList &L,int n){
//逆位序输入n个元素的值,建立到头结点的单链表L
LNode *p;
L=new LNode;
L->next=NULL; //先建立一个带头结点的空链表
cout<<"请输入 "<<n<<" 个数:\n";
for(int i=n;i>0;--i){
p=new LNode; //生成新结点
cin>>p->data; //输入元素值
p->next=L->next;L->next=p;//插入到表头
}
}//平均时间复杂度为O(n)



//-------------------------后插法创建单链表-----------------//

void CreateList_L(LinkList &L,int n){
//正位序输入n个元素的值,建立到头结点的单链表L
LNode *r,*p;
L=new LNode;
L->next=NULL; //先建立一个带头结点的空链表
r=L; //尾指针r指向头结点
cout<<"请输入 "<<n<<" 个数:\n";
for(int i=0;i<n;i++){
p=new LNode; //生成新结点
cin>>p->data; //输入元素值
p->next=NULL;r->next=p;//插入到表尾
r=p; //r指向新的尾结点
}
}//平均时间复杂度为O(n)


0 0
原创粉丝点击