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);
    }
}
原文地址:https://www.cnblogs.com/qq136155330/p/8251330.html