线性表的链式表示和实现

/*线性表的链式表示和实现*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int Status;
typedef int ElemType;
#define TRUE 1
#define ERROR 0
#define FALSE 0
#define OK 1
#define OVERFLOW -2
typedef struct LNode{
    ElemType data;
    struct LNode  *next;
}LNode,*LinkList;
Status Equal(ElemType a,ElemType b){
    if(a==b)
        return TRUE;
    else
        return FALSE;
}
Status InitList_L(LinkList &l){
    l=(LNode*)malloc(sizeof(LNode));
    if(!l)
        exit(OVERFLOW);
    l->next=NULL;
    return OK;
}
Status DestroyList_L(LinkList &l){
    LNode *p=l;
    while (l){
        p=l;
        l=l->next;
        free(p);
    }
    return OK;
}
Status ClearList_L(LinkList &l)
{
    LNode *p=l;
    while (l->next){
        p=l->next;
        l->next=p->next;
        free(p);
    }
    return OK;
}
int ListLength(LinkList l){
    LNode  *p=l;
    int len=0;
    while(p->next){
        len++;p=p->next;
    }
    return len;
}
Status ListEmpty(LinkList l){
    if (l->next==NULL)
        return TRUE;
    else return FALSE;
}
Status GetElem(LinkList l,int i,ElemType &e){
    int alen,j=0;
    LNode *p=l;
    alen=ListLength(l);
    if(i<1||i>alen)
    exit(ERROR);
    while(p->next&&j<i) {
        j++;
        p=p->next;
    }
    e=p->data;
    return OK;
}
int LocateElem(LinkList l,ElemType e,Status(*compare)(ElemType,ElemType)){
   LNode *p=l;
   int i=1,alen;
   alen=ListLength(l);
   while(i<=alen&&!(*compare)(p->next->data,e)){
        ++i;p=p->next;
   }
   if(i<=alen)
        return i;
   else
        return 0;
 }
Status ListInsert(LinkList &l,int i,ElemType e){
    int alen,j=0;
    LNode *p=l,*q;
    alen=ListLength(l);
    if(i<1||i>alen+1)
        exit(ERROR);
    while (p->next&&j<i-1){
        j++;
        p=p->next;
    }
    q=(LNode*)malloc(sizeof(LNode));
    if(!q)
        exit(OVERFLOW);
    q->data=e;
    q->next=p->next;
    p->next=q;
    return OK;
}

Status ListDelete(LinkList &l,int i,ElemType &e){
    int alen,j=0;
    LNode *p=l,*q;
    alen=ListLength(l);
    if(i<1||i>alen)
        return ERROR;
    while (p->next&&j<i-1){
        j++;
        p=p->next;
    }
    q=p->next;
    p->next=p->next->next;
    free(q);
    return OK;
}

void Print(ElemType c){
    printf("%d ",c);
}
Status ListTraverse(LinkList l,void(*vi)(ElemType)){
   LNode *p=l;
   int i;
   while (p->next){
        p=p->next;
        vi(p->data);
   }
   printf("\n");
   return OK;
}
void Union(LinkList &La,LinkList Lb){
    ElemType e;
    int La_len=ListLength(La);
    int Lb_len=ListLength(Lb);
    for(int i=1;i<=Lb_len;i++){
        GetElem(Lb,i,e);
        if(!LocateElem(La,e,Equal))
            ListInsert(La,++La_len,e);
    }
}
int a[5]={3,5,8,11},b[8]={2,6,8,9,11,15,20};
int main(){
    LinkList La,Lb;
    int n,i;
    InitList_L(La);
    InitList_L(Lb);
    for(i=1;i<=4;i++){
        ListInsert(La,i,a[i-1]);
    }
    for(i=1;i<=7;i++){
        ListInsert(Lb,i,b[i-1]);
    }
    Union(La,Lb);
    ListTraverse(La,Print);
    return 0;
}
posted @ 2017-10-17 11:25  神探小小狄  阅读(117)  评论(0编辑  收藏  举报
【推荐】 程序员网址大全  |  EF CodeFirst  |  百度地图.NET  |  MyNPOI  |  开源  |  我的皮肤  |  ASP.NET MVC4  |  前端提升   |  LINQ   |  WCF   |  EasyUI  | aaronyang 页脚html代码