zoukankan      html  css  js  c++  java
  • FJUT ACM 1902 增删

    什么是链表?

    就是一种增加,删除便捷的数据结构

    因为链表要用来增加和删除,所以链表所申请的内存空间应该是不固定的。

    什么是链表呢

    通过指针的指向来连接起来!因为每个数据中都会有一个指向的地址,所以按指向的地址去寻找,就算他们的地址是没有连续的,也可以通过地址的指向来连接起来!

    来看下创建的代码!

    以下代码所对应的题目是T^T online judge 1902 

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    char x[4];
    typedef struct node
    {
        int data;
        struct node *next;//创建一个指向 struct node 类型的指针,类似于int *的指针。
    } Node;//先声明一个结构体,来满足指向下一个的数的地址需求。
    Node *creat()
    {
        Node *s;/*因为使用了typedef struct node{}Node;所以Node==struct node;可以直接用Node来声明一个Node类的指针*/
        s=(Node*)malloc(sizeof(Node));//获取一个大小为Node的内存
    s->next=NULL;//s->next==s.next

    return s;
    }
     
    //申请一个如上的链表的一部分
    int main()
    {
        Node *head;
        Node *p;
        int a;
        int j;
        int n;
        int m;
        int i;
        int qq;
        int qqq;
        while(~scanf("%d%d",&n,&m))
        {
        j=0;
        i=0;
        head=creat();
        p=head;
        while(1)
        {
            Node *s;
            s=creat();
            j++;
            scanf("%d",&a);
            s->data=a;
            p->next=s;
            p=p->next;//这个p=p->next的意思就是移动到下一位;p->next=s;所以p=s;
            //if(a==-1)break;
            if(j>=n)break;
        }/*上方的代码是int main()中的截取代码,表示为创建一个大小为n个数的链表, 过程如图,

     

    就是这样创建并且连接起来的*/
    for(i=0; i<m; i++)
        {
            scanf("%s",x);
            if(x[0]=='A')
            {
                scanf("%d%d",&qq,&qqq);
                add(head,qq,qqq);
            }
            if(x[0]=='D')
            {
                scanf("%d",&qq);
                //printf("%d
    ",qq);
                del(head,qq);
            }
            //printf("..
    ");
            //dis(head);
            memset(x,0,strlen(x));
        }
        dis(head);
        clearl(head);
        }
        return 0;
    }
    /*添加的思路就是,用两个指针去走,一个在前,一个在后。然后插入,具体看下图,代码有对链表内有多个数要添加做出分析!而图示就讲一个:

    就完成了添加,多个数要添加做出分析这个不讲感兴趣的自己理解代码*/
    void add(Node *p,int x,int y)
    {
        Node *q;
        Node *s;
        q=p->next;
        while(q)
        {
            if(p->data==x)
            {
                s=creat();
                s->data=y;
                p->next=s;
                s->next=q;
                if(x==y)
                {p=p->next->next;
                q=q->next;}
                else
                    p=p->next;
            }
            else
            {
                p=p->next;
                q=q->next;
                //printf("\\..
    ");
            }
        }
        if(p->data==x)
        {//printf("..
    ");
            s=creat();
            s->data=y;
            p->next=s;
            s->next=NULL;
        }
    }
    /*删除
    删除的思路,跟添加的思路类似,也是使用两个指针去跑!
    void del(Node *p,int x)
    {
        Node *q;
        q=p->next;
        while(q)
        {
            if(q->data==x)
            {
                p->next=q->next;
                free(q);
                if(p->next!=NULL)
                    q=p->next;
                else
                    break;
            }
            else
            {
                p=p->next;
                q=q->next;
            }
        }
    }
    /*dis输出链表中的全部数值,这个较简单,只要使用head头指针去跑就可以了,图示如下

    就是不断使用p=p->next去移动地址,移向下一位后,输出p->data,就是int值。
     */
    void dis(Node *p)
    {
        p=p->next;
        while(p)
        {
            printf("%d ",p->data);
            p=p->next;
    
        }
        printf("
    ");
    }
    /*clear清空链表,就是一个递归,能理解就理解,不能理解我也没办法/摊手*/
    void clearl(Node *p)
    {
        if(p!=NULL)
        {
            clearl(p->next);
            free(p);
        }
    }
  • 相关阅读:
    《STL源码剖析》-- 序列式容器
    IPV6 组播学习理解
    C 语言指针 引用学习
    C++ list 源码学习
    汇编基础学习---浮点运算
    C++ 运算符重载
    C++ 迭代器学习
    Play框架连接Mysql遇到的一些问题
    Jython中文乱码问题
    多线程之生产者消费者模式
  • 原文地址:https://www.cnblogs.com/qq136155330/p/8251330.html
Copyright © 2011-2022 走看看