zoukankan      html  css  js  c++  java
  • 线性表单链表的实现

    一、基本操作

     1)定义

    typedef int ElementType;
    typedef LNode *PtrToLNode;//指向结点的指针
    struct LNode{
    ElementType data;
    PtrToLNode next;
    };
    typedef PtrToLNode List;

    2)初始化
        List L;
        L=(LNode *)malloc(sizeof(LNode));//生成头结点
        L->next=NULL;

    3)单链表的建立

    ①头插法

    void CreateListF(List *L){
        int i;
        for(i=1;i<=5;i++){
            PtrToLNode q;
            q=(PtrToLNode)malloc(sizeof(Node));//初始化!!!
            q->data=i;
            q->next=(*L)->next;
            (*L)->next=q;
        }
    }

    ②尾插法

    void CreateListR(List *L){
        int i;
        PtrToLNode r;//尾指针
        r=*L;
        for(i=1;i<=5;i++){
            PtrToLNode q;
            q=(PtrToLNode)malloc(sizeof(Node));
            q->data=i;
            r->next=q;
            r=q;
        }
        r->next=NULL;//!!!
    }

    4)遍历单链表并且求其长度

    int GetListLength(List *L){
        PtrToLNode ptr;
        ptr=(*L)->next;
        int length=0;
        while(ptr!=NULL){
            length++;
            printf("%d ",ptr->data);
            ptr=ptr->next;
        }
        printf(" ");
        return length;
    }

    5)在第i个位置前插入新结点

    //有头结点,在第i个位置前插入某个元素,所以i大于等于1小于等于表长
    Status ListInsert(List *L,int i,ElementType e){
        int j=0;
        PtrToLNode t,q;
        t=(PtrToLNode)malloc(sizeof(Node));
        q=*L;//不是p->(*L)->next;
        //q指向第i-1个结点
        while(j<i-1&&q){
            j++;
            q=q->next;
        }
        if(j>i-1||!q){//如果i<=1,j<i-1;如果i>表长,q=NULL
            return ERROR;
        }
        t->data=e;
        t->next=q->next;
        q->next=t;
        return OK;
    }

    6)删除第i个结点

    //单链表删除和插入操作都要找第i个位置的前一个结点!

    Status ListDelete(List *L,int i,ElementType *e){
        int j=0;
        PtrToLNode t,q;
        t=(PtrToLNode)malloc(sizeof(Node));
        q=*L;
        while(j<i-1&&q){
            j++;
            q=q->next;
        }
        if(j>i-1||!q){
            return ERROR;
        }
        t=q->next;
        *e=t->data;
        q->next=t->next;
        return OK;
    }

    二、栗子

    #include <stdio.h>
    #include <stdlib.h>
    #define ERROR -1
    #define OK 1
    typedef int Status;//函数返回状态
    typedef int ElementType;
    typedef struct LNode *PtrToLNode;//指向结点的指针
    struct LNode{
    ElementType data;
    PtrToLNode next;
    };
    typedef struct LNode Node;
    typedef PtrToLNode List;
    
    
    void CreateListF(List *L);
    void CreateListR(List *L);
    int GetListLength(List *L);
    Status ListInsert(List *L,int i,ElementType e);
    Status ListDelete(List *L,int i,ElementType *e);
    
    int main()
    {
        List L;
        int length;
        //初始化
    
        L=(PtrToLNode)malloc(sizeof(Node));//生成头结点
        L->next=NULL;
        //头插法
        CreateListF(&L);
        //遍历单链表并且求其长度
        printf("头插法:");
        length=GetListLength(&L);
        printf("长度:%d
    ",length);
        //尾插法
        CreateListR(&L);
        //遍历单链表并且求其长度
        printf("尾插法:");
        length=GetListLength(&L);
        printf("长度:%d
    ",length);
        //在第i个位置前插入新结点
        int t=ListInsert(&L,1,666);
        if(t==1){
            printf("链表长度为:%d
    ",GetListLength(&L));
        }
        else if(t==-1){
            printf("插入位置越界
    ");
        }
        //删除第i个结点
        int e;
        t=ListDelete(&L,1,&e);
        if(t==1){
            length=GetListLength(&L);
            printf("长度:%d
    ",length);
            printf("删除的元素为:%d
    ",e);
        }
        else if(t==-1){
            printf("删除位置越界
    ");
        }
    
        return 0;
    }
    
    void CreateListF(List *L){
        int i;
        for(i=1;i<=5;i++){
            PtrToLNode q;
            q=(PtrToLNode)malloc(sizeof(Node));//初始化!!!
            q->data=i;
            q->next=(*L)->next;
            (*L)->next=q;
        }
    }
    void CreateListR(List *L){
        int i;
        PtrToLNode r;//尾指针
        r=*L;
        for(i=1;i<=5;i++){
            PtrToLNode q;
            q=(PtrToLNode)malloc(sizeof(Node));
            q->data=i;
            r->next=q;
            r=q;
        }
        r->next=NULL;//!!!
    }
    int GetListLength(List *L){
        PtrToLNode ptr;
        ptr=(*L)->next;
        int length=0;
        while(ptr!=NULL){
            length++;
            printf("%d ",ptr->data);
            ptr=ptr->next;
        }
        printf("
    ");
        return length;
    }
    //有头结点,在第i个位置前插入某个元素,所以i大于等于1小于等于表长
    Status ListInsert(List *L,int i,ElementType e){
        int j=0;
        PtrToLNode t,q;
        t=(PtrToLNode)malloc(sizeof(Node));
        q=*L;//不是p->(*L)->next;
        //q指向第i-1个结点
        while(j<i-1&&q){
            j++;
            q=q->next;
        }
        if(j>i-1||!q){//如果i<=1,j<i-1;如果i>表长,q=NULL
            return ERROR;
        }
        t->data=e;
        t->next=q->next;
        q->next=t;
        return OK;
    }
    Status ListDelete(List *L,int i,ElementType *e){
        int j=0;
        PtrToLNode t,q;
        t=(PtrToLNode)malloc(sizeof(Node));
        q=*L;
        while(j<i-1&&q){
            j++;
            q=q->next;
        }
        if(j>i-1||!q){
            return ERROR;
        }
        t=q->next;
        *e=t->data;
        q->next=t->next;
        return OK;
    }

    三、总结

    1)存储结构:链式存储结构

    2)特点:存储单元不连续

    3)存取方式:顺序存取

    4)有头结点和无头结点的操作差异

    5)删除和插入第i个结点,都是要找到第i-1个结点

  • 相关阅读:
    Object-c学习之路四(oc内存管理autorelease)
    Object-c学习之路三(@class与#import的区别)
    Object-c学习之路二(oc内存管理黄金法则1)
    Object-c学习之路(oc点语法)
    python(学习之路一)
    css中的position属性
    盒子模型——边框(Border)
    CSS盒子模型
    form(表单)标签常用标签及属性
    Codeforces Round #271 (Div. 2) D Flowers【计数dp】
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/7637009.html
Copyright © 2011-2022 走看看