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个结点

  • 相关阅读:
    fullCalendar改造计划之带农历节气节假日的万年历(转)
    Linked List Cycle
    Remove Nth Node From End of List
    Binary Tree Inorder Traversal
    Unique Binary Search Trees
    Binary Tree Level Order Traversal
    Binary Tree Level Order Traversal II
    Plus One
    Remove Duplicates from Sorted List
    Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/7637009.html
Copyright © 2011-2022 走看看