当前位置:   article > 正文

链表之单链表的实现_按需所取

按需所取

链表的特点:

        1:空间上按需所取;

        2:物理空间不连续

                        

 链表在物理空间上的不连续,方便增删查改;

单链表包括存储的数据和指向下一个节点的指针

链表基础结构由结构体实现

  1. typedef int LIST;//方便更改类型
  2. typedef struct SList
  3. {
  4. LIST data;
  5. struct SList* next;
  6. }SList;

主要有四个功能:

增删查改;

     1:增加又可分为从头增加、从尾增加、从某个元素前增加

                                尾增:

  1. void Singlelist()
  2. {
  3. SLIST* p = NULL;//定义一个标头
  4. ListData(&p, 1);
  5. listprint(p);//打印
  6. }
  7. void ListData(SLIST** pphead, LIST x)
  8. {
  9. SLIST* newnode = (SLIST*)malloc(sizeof(SLIST));//为新节点开辟空间
  10. if (newnode == NULL)
  11. return;
  12. newnode->data = x;
  13. newnode->next = NULL;//最后一个单链表的指针指向空
  14. if (*pphead == NULL)//判断链表是否为空
  15. {
  16. *pphead = newnode;
  17. }
  18. else
  19. {
  20. SLIST* replica = *pphead;
  21. while (replica->next != NULL)
  22. {
  23. replica = replica->next;
  24. }
  25. replica->next = newnode;//存放下一节点的地址
  26. }
  27. }

                 头增:

  1. void ListData1(SLIST** pphead, LIST x)//头增
  2. {
  3. SLIST* newnode = BuyBode(x);
  4. if (*pphead == NULL)//判断链表是否为空
  5. {
  6. newnode->next = NULL;
  7. *pphead = newnode;
  8. }
  9. else
  10. {
  11. newnode->next = *pphead;
  12. *pphead = newnode;
  13. }
  14. }

从某个元素后面增加:

                要实现这一点,首先要找到要增加的位置;就需查找;

  查找元素:

  1. SLIST* NodeSeek(SLIST* phead,LIST x)//查找
  2. {
  3. SLIST* replica = phead;
  4. while (replica != NULL)
  5. {
  6. if (replica->data == x)
  7. return replica;
  8. replica = replica->next;
  9. }
  10. return NULL;
  11. }

                接着实现在某个元素前面增加节点:

  1. SLIST* pos = NodeSeek(p, 3);
  2. if (pos)
  3. {
  4. InsertNode(&p, pos, 10);
  5. }
  6. void InsertNode(SLIST** pphead,SLIST*pos, LIST x)
  7. {
  8. if (pos == *pphead)
  9. {
  10. ListData1(pphead, x);//当要被插入的位置是第一个元素前时,就相当于头增
  11. }
  12. else
  13. {
  14. SLIST* newnode = BuyBode(x);
  15. SLIST* prev = *pphead;
  16. while (prev->next != pos)
  17. {
  18. prev = prev->next;
  19. }
  20. prev->next = newnode;
  21. newnode->next = pos;
  22. }
  23. }

以上增查就完成了;

接着来实现删除:

                删除分为从头删除、从尾删除,删除某个位置的值;

                        头删

  1. void HeadDel(SLIST** pphead)//头删
  2. {
  3. SLIST* next = (*pphead)->next;
  4. free(*pphead);
  5. *pphead = next;
  6. }

                尾删

  1. void EndDel(SLIST** pphead)//尾删
  2. {
  3. if (*pphead == NULL)//如果链表为空
  4. return;
  5. else if ((*pphead)->next == NULL)//如果链表只有一个元素
  6. {
  7. free(*pphead);
  8. *pphead = NULL;
  9. }
  10. else//链表有多个元素
  11. {
  12. SLIST* rev = NULL;
  13. SLIST* replica = *pphead;
  14. while (replica->next != NULL)//查找最后一个元素
  15. {
  16. rev = replica;//存放replica前一个元素
  17. replica = replica->next;
  18. }
  19. free(replica);
  20. rev->next = NULL;
  21. }
  22. }

        删除某个位置的值

  1. pos = NodeSeek(p, 3);//查找元素3的节点
  2. if (pos)
  3. {
  4. DelNode(&p, pos);
  5. }
  6. void DelNode(SLIST** pphead, SLIST* pos)//删除指定位置元素
  7. {
  8. if ((*pphead) == pos)
  9. {
  10. HeadDel(pphead);
  11. }
  12. else
  13. {
  14. SLIST* sev = *pphead;
  15. while (sev->next != pos)
  16. {
  17. sev = sev->next;
  18. }
  19. sev->next = pos->next;
  20. free(pos);
  21. }
  22. }

            本篇文章就再次结束了,不完善的地方可以指出或者自行修改,谢谢大家

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号