链表的表示与实现

#include<iostream.h>
#include<stdlib.h>
#define LIST_INIT_SIZE       100
#define OK      1
#define OVERFLOW    -2
#define ERROR   0
typedef int Status;

typedef int ElemType;
typedef struct LNode
{
    ElemType  data;     //数据域
    struct LNode  *next;       //指针域
}LNode,*LinkList;

Status InitList_L(LinkList &L)
{
    //构造一个空的链表
    L=new LNode;
    if(!L)
        exit(OVERFLOW);
    L->next=NULL;
    return OK;
}//InitList_L

void ListCreate_L(LinkList &L,int n)
{
    //创建链表  尾插法
    ElemType x;
    LNode *p;
    cout<<"input x(n)="<<endl;
    for(int i=n;i>0;--i)
    {
        p=new LNode;
        if(!p)
            exit(OVERFLOW);
        cin>>x;
        p->data=x;
        p->next=L->next;L->next=p;
    }
}//ListCreate_L

Status GetElem_L(LinkList L,int i,ElemType &e)
{
    //L是带头结点的链表的头指针,以e返回第i个元素
    LNode *p;
    int j;
    p=L->next;
    j=1;          //p指向第一个结点,j为计数器
    while(p && j<i)
    {
        p=p->next;
        ++j;
    }
    //顺指针向后查找,直到p指向第i个元素,或p为空
    if(!p || j>i)
        return ERROR;           //第i个元素不存在
    e=p->data;        //取得第i个元素
    return OK;
}//GetElem_L

Status ListInsert_L(LinkList &L,int i,ElemType e)
{
    //L为带头结点的单链表的头指针,本算法
    //在链表中第i个结点之前插入新的元素 e
    LNode *p,*q;
    int j;
    p=L;
    j=0;
    while(p && j<i-1)
    {
        p=p->next;
        ++j;
    }          //寻找第i-1个结点
    if(!p || j>i-1)
        return ERROR;      //i大于表长或者小于1
    q=new LNode;        //生成新结点
    q->data=e;
    q->next=p->next;
    p->next=q;       //插入
    return OK;
}//LinstInsert_L

Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
    //删除以L为头指针(带头结点)的单链表中第i个结点
    LNode *p,*q;
    int j;
    p=L;
    j=0;
    while(p->next && j<i-1)
    {
        p=p->next;
        ++j;
    }         //寻找第i个结点,并令p指向其前趋
    if(!(p->next) || j>i-1)
        return ERROR;   //删除位置不合理
    q=p->next;
    p->next=q->next;       //删除并释放结点
    e=q->data;
    delete q;
    return OK;
}//ListDelete_L

void visit_L(LinkList L)
{
    LNode *p=L->next;
    while(p)
    {
        cout<<p->data<<"  ";
        p=p->next;
    }
    cout<<endl;
}


void main()
{
    LinkList L;
    ElemType x;
    int i,n;
    InitList_L(L);
    cout<<"input LinkList n=";
    cin>>n;
    ListCreate_L(L,n);
    visit_L(L);
    cout<<"input getElem i=";
    cin>>i;
    if(GetElem_L(L,i,x))
        cout<<x<<endl;
    else
        cout<<"GetElem i error!\n";
    cout<<"input insert i,x=";
    cin>>i>>x;
    if(ListInsert_L(L,i,x))
        visit_L(L);
    else
        cout<<"Insert i error!\n";
    cout<<"input delete i=";
    cin>>i;
    if(ListDelete_L(L,i,x))
    {
        cout<<"Delete Elem is"<<x<<endl;
        visit_L(L);
    }
    else
        cout<<"Delete i error!\n";
}

 

posted on 2013-04-23 21:49  绕指柔yy  阅读(180)  评论(0编辑  收藏  举报

导航