单链线性表的实现

//函数结果状态代码


#define    TRUE    1
#define    FALSE    0
#define    OK        1
#define    ERROR    0
#define    INFEASIBLE    -1
#define    OVERFLOW    -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef int ElemType;

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

Status GetElem_L(LinkList L,int i,ElemType &e){
    //L为带头结点的单链表的头指针。
    //当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
    LNode *p;
    int j;
    p=L->next;j=1;        //初始化,p指向第一个结点,j为计数器
    while(p && j<i){        //顺指针向后查找,直到p指向第i个元素或p为空
        p=p->next;++j;
    }
    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
    LinkList p,s;
    int j;
    p=L; j=0;
    while(p && j<i-1){    //寻找第i-1个结点
        p=p->next;++j;
    }
    if(!p || j>i-1)    return ERROR;    //i小于1或者大于表长加1
    s=(LinkList)malloc(sizeof(LNode));    //生成新结点
    s->data=e;s->next=p->next;        //插入L中
    p->next=s;
    return OK;
}//ListInsert_L

Status ListDelete_L(LinkList &L,int i,ElemType e){
    //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
    LinkList p,q;
    int j;
    p=L; j=0;
    while(p->next && j<i-1){    //寻找第i个结点,并令p指向其前趋
        p=p->next;++j;
    }
    if(!(p->next) || j>i-1)    return ERROR;    //删除位置不合理
    q=p->next;p->next=q->next;                //删除并释放结点
    e=q->data;free(q);
    return OK;
}//ListInsert_L

void CreateList_L(LinkList &L,int n){
    //逆位序输入n个元素的值,建立带表头结点的单链线性表L。
    int i;
    LinkList p;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;        //先建立一个带头结点的单链表
    for(i=n;i>0;--i){
        p=(LinkList)malloc(sizeof(LNode));        //生成新结点
        scanf("%d",&p->data);                        //输入元素值
        p->next=L->next;L->next=p;                //插入到表头
    }

}//CreateList_L

void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){
    //已至单链线性表La和Lb的元素按值非递减排序
    //归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排序。
    LinkList pa,pb,pc;
    pa=La->next;pb=Lb->next;
    Lc=pc=La;            //用La的头结点作为Lc的头结点
    while(pa && pb){
        if(pa->data<=pb->data){
            pc->next=pa;pc=pa;pa=pa->next;
        }else{
            pc->next=pb;pc=pb;pb=pb->next;
        }
    }
    pc->next=pa?pa:pb;            //插入剩余段
    free(Lb);                    //释放Lb的头结点
}//MergeList_L
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "malloc.h"
#include "LinkList.h"

int main(int argc, char* argv[])
{
    LinkList L;
    ElemType e;
    ElemType in;
    int n;
    n=5;
    CreateList_L(L,5);
    GetElem_L(L,n,e);
    printf("GetElem %d: %d ",n,e);

    in=6;
    ListInsert_L(L,5,in);
    GetElem_L(L,n,e);
    printf("GetElem %d: %d ",n,e);
    return 0;
}
原文地址:https://www.cnblogs.com/13yan/p/3417150.html