链表的常见操作入门(一)

链表的建立:

      一般采用结构体指针,建立如下:

struct node
{
      int data;
      struct node *next;
}

链表的头文件:

#include<stdlib>

链表基本模板:

 (1)链表建立:

struct node
{
     int m;
     struct node *next;
}*p,*q,*o;

(2)链表开辟:

        ///开辟初始位置的头结点
        q = (struct node*)malloc(sizeof(struct node));
        ///循环寻找的结点
        p = q;
        for(int i=0; i<N; i++)
        {
            scanf("%d",&date);
            ///开辟的结点
            o = (struct node*)malloc(sizeof(struct node));
            p->next = o;
            o->m = date;
            p = o;
        }
        ///结束结点的位置指向
        p->next = NULL;
        ///开始输出
        p = q->next;

(3)链表处理

      p = q->next;
       free(q);
       while(p!=NULL)
       {
            ///操作处理地方。
            /*
            .
            .
            .
            */
            o = p;
            p = p->next;
            free(o);
       }
       free(p);

链表的基本操作:

(1)查找

  如题:给定单链表头结点,删除链表中倒数第k个结点。

第一种方法:直接删除某个位置的元素。

for(int i=0; i<K; i++)
{
    if(i==K-N)
    {
        s = p;
        r->next = p->next;
        p = p->next;
        free(s);
    }
    else
    {
        r = p;
        p = p->next;
    }
}

 第二种方法:在建立结构体是建一个变量,去记录第几个元素。从而判断是不是我们寻找的?

N = N -1;
b = 0;
while(p!=NULL)
{
    if(p->n!=K-N)
    {
        if(b==0)
        {
            printf("%d",p->m);
            b=1;
        }
        else printf(" %d",p->m);
    }
    o = p;
    p = p->next;
    free(o);
}
(2)去数

  如题:已知一个线性表,要求删除线性表内大于等于min且小于等于man的数,并输出删除后的线性表

直接输出加一个要求就可以了。

       while(p!=NULL)
       {
            if(!(p->m>=min && p->m<=max))
            {
                if(b==0)
                {
                    printf("%d",p->m);
                    b=1;
                }
                else printf(" %d",p->m);
            }
            o = p;
            p = p->next;
            free(o);
        }

(3)遍历

  如题:现在有一个中奖号码,有一个兑奖号码,小T想知道一共有多少个数字位置正确的,N太大了……

  数组一个也可以AC,但是最好去学习链表的方式,毕竟你要学习链表。 

代码如下:

int Answer(struct node *ch,struct node *sh)
{
    int ans =0;
    while(ch!=NULL)
    {
        if(ch->n == sh->n)
            ans++;
        o = ch;
        ch = ch->next;
        free(o);
        o = sh;
        sh = sh->next;
        free(o);
    }
    return ans;
}

以上就是链表的基础操作学习,如有更进一步的链表学习,将在下一篇博文。

posted @ 2017-09-08 11:52  让你一生残梦  阅读(246)  评论(0编辑  收藏  举报