• 单链表的插入删除


    按位序插入(带头结点)

    ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e(带头结点)

    1. typedef struct LNode
    2. {
    3. ElemType data;
    4. struct LNode* next;
    5. }LNode,*LinkList;
    6. //在第i个位置插入元素e(带头结点)
    7. bool ListInsert(LinkList &L,int i,ElemType e)
    8. {
    9. if(i<1)
    10. return false;
    11. LNode *p;//指针p指向当前扫描到的结点
    12. int j=0;//当前p指向的是第几个结点
    13. p=L;//L指向头结点,头结点是第0个结点(不存数据)
    14. while(p!=NULL&&j<i-1)//循环找到第i-1个结点
    15. {
    16. p=p->next;
    17. j++;
    18. }
    19. if(p==NULL)//i值不合法
    20. return false;
    21. LNode* s=(LNode*)malloc(sizeof(LNode));
    22. s->data=e;
    23. s->next=p->next;
    24. p->next=s;//将结点s连到p之后
    25. return true;//插入成功
    26. }

    按位序插入(不带头结点)

    ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e

    • 与带头结点的区别:不存在“第0个”结点,因此i=1时需要特殊处理,因为如果不带头结点,则插入、删除第一个元素时,需要更改头指针L
    1. bool ListInsert(LinkList& L,int i,ElemType e)
    2. {
    3. if(i<1)
    4. return false;
    5. if(i==1)//插入第i个结点的操作与其他节点不同
    6. {
    7. LNode* s=(LNode*)malloc(sizeof(LNode));
    8. s->data=e;
    9. s->next=L;
    10. L=s;//头指针指向新节点
    11. return true;
    12. }
    13. LNode* p;//指针p指向当前扫描到的结点
    14. int j=1;//当前p指向的是第几个结点
    15. p=L;//p指向第1个结点(注意:不是头结点)
    16. while(p!=NULL&&j<i-1)
    17. {
    18. //循环找到第i-1个结点
    19. p=p->next;
    20. j++;
    21. }
    22. if(p==NULL)//i值不合法
    23. return false;
    24. LNode* s=(LNode*)malloc(sizeof(LNode));
    25. s->data=e;
    26. s->next=p->next;
    27. p->next=s;
    28. return true;//插入成功
    29. }
    30. typedef struct LNode
    31. {
    32. Elemtype data;
    33. struct LNode* next;
    34. }LNode,*LinkList;

    指定结点的后插操作

    1. bool InsertNode(LNode* p,Elemtype e)
    2. {
    3. if(p==NULL)
    4. return false;
    5. LNode* s=(LNode*)malloc(sizeof(LNode));
    6. if(s==NULL)
    7. return false;
    8. s->data=e;
    9. s->next=p->next;
    10. p->next=s;
    11. return true;
    12. }
    13. typedef struct LNode
    14. {
    15. ElemType data;
    16. struct LNode* next;
    17. }LNode,*LinkList;

    指定结点的前插操作

    1. //前插操作:在p结点之前插入结点s
    2. bool InsertPriorNode(LNode* p,LNode* s)
    3. {
    4. if(p==NULL||s==NULL)
    5. return false;
    6. s->next=p->next;
    7. p->next=s;
    8. ElemType temp=p->data;
    9. p->data=temp;
    10. return true;
    11. }

    按位序删除(带头结点)

    ListDelet(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值

    1. bool ListDelete(LinkList& L,int i,ElemType& e)
    2. {
    3. if(i<1)
    4. return false;
    5. LNode* p;
    6. int j=0;
    7. p=L;
    8. while(p!=NULL&&j<i-1)
    9. {
    10. p=p->next;
    11. j++;
    12. }
    13. if(p==NULL)
    14. return false;
    15. if(p->next==NULL)
    16. return false;
    17. LNode* p=p->next;
    18. free(q);
    19. return true;
    20. }
  • 相关阅读:
    JS如何实现一个注册按钮10秒倒计时效果
    XML介绍、基本语法和dom4j解析技术教学
    Modbus转Profinet网关在污水处理系统中连接PLC和变频器Modbus通信案例
    ESP8266-Arduino编程实例-VEML6040颜色传感器驱动
    Windows 11 22621.1 , 10.0.22622.290 文件资源管理器中启用多标签,全新导航栏
    【Zookeeper专题】Zookeeper选举Leader源码解析
    adb server version (19045) doesn‘t match this client (41); killing.的解决办法
    python中的生成器
    美联储加息已成“政治正确” 美元涨势难以阻挡?
    夯实基础,数据库的第1、2、3范式
  • 原文地址:https://blog.csdn.net/lxr_lxr_/article/details/136589913