zoukankan      html  css  js  c++  java
  • 线性表的链式表示和实现

    /*线性表的链式表示和实现*/
    #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("
    ");
       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;
    }
  • 相关阅读:
    基于ASP.NET的comet简单实现
    常用的富文本框插件FreeTextBox、CuteEditor、CKEditor、FCKEditor、TinyMCE、KindEditor ;和CKEditor实例
    关于Application.Lock和Lock(obj)
    asp.net 母版页使用详解--转
    ASP.NET 全局变量和页面间传值方法
    黑帽大会2014:10个酷炫的黑客工具
    python之高性能网络编程并发框架eventlet实例
    eCos中的线程与同步
    Ubuntu12.04 下修改Apache端口号
    PHP 之mysql空字符串问题
  • 原文地址:https://www.cnblogs.com/kzbin/p/9205291.html
Copyright © 2011-2022 走看看