zoukankan      html  css  js  c++  java
  • 链表:单向链表的理解,创建及基本操作

    链表的创建
    typedef struct info{
        int data;
        struct info *next;
    }node;
    int main(){
        node *head=NULL;
    }//这是一个空链表,head是它的开头,然而现在什么都没有

      我们得到这样的数据类型:该类型包含数据(data)和指针next两部分,指针指向下一个相同的结构体.
    像这样

    链表的基本操作

    • 现在我们需要新增这样的结构体并链接它们,为了更方便地对链表进行操作,我们再引入这样一个结构体;
    typedef struct ctrl{
        node *head;//指向链表头部
        node *tail;//指向链表尾部   方便后续操作
    }List;
    
    void add(List *list,int num){//尾插
        node *p=(node *)malloc(sizeof(node));
        p->next=NULL;
        p->data=num;
        if(list->next){
            list->tail=p;
        }else{
            list->head=list->tail-p;
        }
    }
    void head_add(List *plist,int num){//头插 
        node *p=(node *)malloc(sizeof(node));
        p->num=num;
        if(plist->head){//链表不为空
            p->next=plist->head;
            plist->head=p;
        }else{//链表为空
            plist->head=p;
            p->next=NULL;
        }
    }
    int main(){
        int num;
        List list;
        list.head=list.tail=NULL;
        while(scanf("%d",&num)&&num!=-1){//假设-1为输入结束标志
        add(&list,num);
        }
    }

    • 查 可以作为遍历的改体
    //遍历输出
    void print(List *list){
        node *p;
        for(p=list->head;p;p=p->next){
        pritnf("想输出啥输出啥");
        }
    }
    //基本查找
    void search(List *list,int obj){
        node *p;
        for(p=list->head;p;p=p->next){
            if(p->data==num){
                printf("//for example,print num'name if it has")
            }
        }
    }
    //可参照查
    node * change(List *list,int num){
        node *p;
        for(p=list->head;p;p=p->next){
            if(p->data==num){
                return p;
            }
        }
    }
    //我们返回这样一个指向目标的指针,可以对其任意部分进行修改

    其实我们也可以写一个void的函数,传入更多参数,进行数据域中不同数据的修改。

    void kill(List *list,int num//按某数据查找目标){
        node *p=list->head,*dead;
        if(p->data==num){//需要删除的是第一个
            list->head=p->next;
            free(p);
        }else{
            for(p;p->next;p=p->next){
                if(p->next->data==num){//找到我们需要删除的
                    dead=p->next;
                    p->next=dead->next;
                    free(dead);//加上break;删除一个即停止
                }
            }
        }
    }
    第一个节点不放东西的写法

      如果第一个节点不放数据,则插入时无需判断链表是否为空,插入时更为简洁。

    void head_add(List *list,int num){
        node *p=(node *)malloc(sizeof(node));
        p->data=num;
        p->next=list->head->next;
        list->head->next=p;
    }//头插时tail失去作用
    
    void add(List *list,int num){
        node *p=(node *)malloc(sizeof(node));
        p->data=num;
        p->next=list->tail->next;//p->next=NULL;
        list->tail->next=p;
        list->tail=p;
    }
    
    int main(){
        List list;
        int num;
        node *p=(node *)malloc(sizeof(node));//空的头结点
        p->next=NULL;
        list.head=list.tail=p;
        while(scanf("%d",&num)&&num!=-1){
            add(&list,num);
        }
    }

    注意此时遍历链表时从list->head->next开始

    //如有错误或更好的方法,还请指出

    2018/4/21

  • 相关阅读:
    Codeforces 723d [暴力dfs]
    Codeforces 723e [图论][欧拉回路]
    Hihocoder 1035 [树形dp]
    Codeforces 721C [dp][拓扑排序]
    Codeforces 721D [贪心]
    info
    关于string操作
    Floyd求最小环 HDU1599
    Codeforces Round #572 (Div. 2) B Number Circle
    A. XXXXX
  • 原文地址:https://www.cnblogs.com/kafm/p/12721871.html
Copyright © 2011-2022 走看看