链表二

继上次的链表一,已经熟悉了链表大致的结构,这篇则是讲基本链表的最终形态

首先来确定一下需要学习链表的哪些东西:添加、打印、寻找、删除和清除

  • void add(List* pList, int number);//添加结点
  • void print(List* list);//打印链表
  • void seek(List* list, int number);//寻找链表中的某个值
  • void del(List* list, int number);//删除结点
  • void clear(List* list);//清除链表

上一篇中,添加结点时候都是从头指针(head)开始,这使得工作效率很低,这次我们想引入一个指针,使它每次都指向链表的最后一个结点

typedef struct _list{
    Node* head;
    Node* tail;
}List;

所以在逻辑上也需要变化

void add(List* pList, int number)
{
    Node* p = (Node*)malloc(sizeof(Node));
    p->value = number;
    p->next = NULL;
    Node* last = plist->tail;
    if (last)
    {
        last->next = p;
        plist->tail = p;//使它永远指向新加入的那个结点
    }
    else
    {
        plist->head = p;
        plist->tail = p;//使它永远指向新加入的那个结点
    }
}

接下来是打印,与上次一样,只不过head在list里了

void print(List* list)
{
    Node* p;
    for (p = list->head; p; p = p->next)
    {
        printf("%d\t", p->value);
    }
    printf("\n");
}

在上次这段代码中,输出时候会弹窗,但是变成函数之后并没有这种情况

void seek(List* list, int number)
{
    Node* p;
    int isFound = 0;
    for (p = list->head; p; p = p->next)
    {
        if (p->value == number)
        {
            printf("找到了!\n");
            isFound = 1;
            break;
        }
    }
    if (isFound == 0)
    {
        printf("没找到!\n");
    }
}

删除的话也没什么变化

void del(List* list, int number)
{
    Node* p;
    Node* q = NULL;
    for (q, p = list->head; p; q = p, p = p->next)
    {
        if (p->value == number)
        {
            if (q)
            {
                q->next = p->next;
            }
            else
            {
                list->head = p->next;
            }
            free(p);
            break;
        }
    }
}

最后是清除

void clear(List* list)
{
    Node* p;
    Node* q;
    for (p = list->head; p; p = q)
    {
        q = p->next;
        free(p);
    }
    printf("清除完毕!");
}

到这基本链表就结束了,有机会会更新数据结构的内容

posted @ 2022-09-18 14:07  Kirilight  阅读(35)  评论(0)    收藏  举报