zoukankan      html  css  js  c++  java
  • 线性表的一般形式

    线性表的一般形式

    考虑到顺序表有着一些线性链表没有的优点,为此,从实际应用角度出发重新定义线性链表及其基本操作。
    可以参考,链栈的链表实现 给出了线性链表在栈中的应用。也是单独定义了链表类型,以统计链表中的元素个数

    结构和一般辅助声明

    #include <stdio.h>
    #include <stdlib.h>
    
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    
    typedef int Status;
    typedef int ElemType;
    
    typedef struct LNode{  /* 结点类型 */
        ElemType data;
        struct LNode *next;
    } * Link, *Position, LNode;
    
    typedef struct {    /* 链表类型 */
        Link head,tail; /* 分别指向链表中的头结点和最后一个结点 */
        int len;        /* 指示链表中的数据元素的个数 */
    }LinkList;
    
    
    
    /* 构造一个空的线性链表 */
    Status InitList(LinkList *L)
    {
        Link p = (Link)malloc(sizeof(LNode)); 
        if(!p)
            return ERROR;
        p->next = NULL;  /* 创建头结点 */
    
        L->head = p;
        L->tail = NULL;
        L->len = 0;
        return OK;
    }
    
    Status MakeNode(Link *p, ElemType e)
    {
        *p = (Link)malloc(sizeof(LNode));
        if(!(*p))
            return ERROR;
        (*p)->data = e;
        (*p)->next = NULL;
        return OK;
    }
    
    /** 返回线性链表L中的第i个结点并返回OK 
     *  i值不合法时返回ERROR,i=0时返回头结点
     */
    Status LocatePos(LinkList *L, int i, Link * t)
    {
        Link p = (*L).head;    /* 从头结点开始 */
        int k = 0;
        while (p && k<i) {
            p = p->next;
            k++;
        }
        /* 验证第i个是否存在 */
        if(!p || k>i)
            return ERROR;
        *t = p;
        return OK;
    }
    
    Status InsFirst(LinkList *L, Link h, Link s)
    {
        if(!s || !h)
            return ERROR;
        s->next = h->next;
        h->next = s;
        (*L).len++;
        return OK;
    }
    
    Status printList(LinkList L)
    {
        Link p = L.head->next;
        while (p) {
            printf("%d ",p->data);
            p = p->next;
        }
    
        printf("
    ");
        
    }
    
    Status ListInsert(LinkList *L, int i, ElemType e)
    {
        Link p,s;
        if(!LocatePos(L,i-1,&p))
            return ERROR;
        if(!MakeNode(&s,e))
            return ERROR;
        InsFirst(L,p,s);
        return OK;
    }
    
    int main()
    {
        LinkList L;
        InitList(&L);
        L.head->data = 555;
        ListInsert(&L,1,250);
        ListInsert(&L,2,500);
        ListInsert(&L,4,500);
        Link t;
        if(LocatePos(&L,2,&t))
            printf("t->data = %d
    ",t->data);
    
        printList(L);
        printf("%d
    ",L.len);
    
    }
    
    
  • 相关阅读:
    Linux tcpdump命令详解
    移动开发网站收集
    Struts+2权威指南基于WebWork核心的MVC开发源码下载
    Eclipse+php插件+Xdebug搭建PHP完美开发/调试环境指南
    java相对目录和绝对目录解析
    python学习网站搜集
    window下开发iphone程序环境搭建iphone tool chain
    Windows下编译objectiveC
    java class路径获取
    完全优化MySQL数据库性能的八个方法
  • 原文地址:https://www.cnblogs.com/wjundong/p/11622491.html
Copyright © 2011-2022 走看看