• 使用C语言实现单链表(不带头节点)


    目录

    1.不带头结点的单链表

    2.链表的定义

    3.相关操作

    (1)初始化操作

    (2)销毁操作

    (3)获取第i个节点

    (4)第i位置插入节点

    (5)指定节点的后插操作

    (6)按值删除节点和删除第i个节点

    (7)按值查询存在性和打印操作

    (8)主函数

    (9)测试


    1.不带头结点的单链表

     

    使用C语言实现带头结点的单链表

    2.链表的定义

    1. #include
    2. #include
    3. typedef int ElemType;
    4. typedef struct LNode {
    5. ElemType data;
    6. struct LNode*next;
    7. }LNode,*LinkList;
    8. //清单列表
    9. void MenuLinkList(){
    10. printf("-------------1.插入操作-------------\n");
    11. printf("-------------2.定位插入操作---------\n");
    12. printf("-------------3.按序查找操作---------\n");
    13. printf("-------------4.按值查找操作---------\n");
    14. printf("-------------5.定位删除操作---------\n");
    15. printf("-------------6.按值删除元素---------\n");
    16. printf("-------------7.删除整个表-----------\n");
    17. printf("-------------8.表的长度-------------\n");
    18. printf("-------------9.打印操作-------------\n");
    19. printf("-------------10.结束操作-------------\n");
    20. }

    3.相关操作

    (1)初始化操作

    1. //初始化不带头节点
    2. void InitList(LinkList&L){
    3. L=NULL;
    4. }

    (2)销毁操作

    1. //销毁表的操作
    2. void DestryLinkList(LinkList&L){
    3. LNode*p=L;
    4. //首先将第一个节点之后的所有节点删除
    5. while(p->next!=NULL){
    6. LNode*s=p->next;
    7. p->next=s->next;
    8. free(s);
    9. }
    10. //最后来删除第一个节点
    11. free(p);
    12. L=NULL;
    13. }

    (3)获取第i个节点

    1. //获取单链表的第i个节点
    2. LNode*GetElem(LinkList L,int i){
    3. int j=1;
    4. LNode*p=L;
    5. if(i<0)return NULL;
    6. if(i==0)return L;
    7. while(p!=NULL&&j
    8. p=p->next;
    9. j++;
    10. }
    11. return p;
    12. }

    (4)第i位置插入节点

    1. //按位序查找第i个节点指针
    2. LNode*FindLNode(LinkList&L,int i){
    3. if(i<1){
    4. printf("不符合插入节点位置!\n");
    5. return NULL;
    6. }
    7. int j=1;
    8. LNode*p=L;
    9. if(i<0)return NULL;
    10. if(i==0)return L->next;
    11. while(p!=NULL&&j
    12. p=p->next;
    13. j++;
    14. }
    15. return p;
    16. }
    17. //如果插入的是在第一个节点 ,这需要进行特殊的处理
    18. LNode*InsertFisrtLNode(LinkList&L,ElemType e){
    19. LNode*s=(LNode*)malloc(sizeof(LNode));
    20. s->data=e;
    21. s->next=L;
    22. L=s;
    23. printf("插入节点成功!\n");
    24. return s;
    25. }
    26. //插入节点到第i个位序中
    27. void ListInsert(LinkList&L,int i,ElemType e){
    28. //如果i=1,这需要进行特殊的处理
    29. if(i==1){
    30. InsertFisrtLNode(L,e);
    31. return ;
    32. }
    33. LNode*p=FindLNode(L,i);
    34. if(p==NULL){
    35. printf("插入节点的位置不合法!\n");
    36. return ;
    37. }
    38. LNode*s=(LNode*)malloc(sizeof(LNode));
    39. s->data=e;
    40. s->next=p->next;
    41. p->next=s;
    42. printf("插入节点成功!\n");
    43. }

    (5)指定节点的后插操作

    1. //指定节点的后插操作
    2. LNode* InsertNextNode(LNode*p,ElemType e){
    3. LNode*s=(LNode*)malloc(sizeof(LNode));
    4. if(s==NULL){
    5. printf("内存分配失败!\n");
    6. return NULL;
    7. }
    8. s->data=e;
    9. s->next=p->next;
    10. p->next=s;
    11. printf("插入节点成功!\n");
    12. return s;
    13. }

    (6)按值删除节点和删除第i个节点

    1. //表的长度
    2. int LinkListLength(LinkList L){
    3. LNode*p=L;
    4. int len=0;
    5. while(p!=NULL){
    6. p=p->next;
    7. len++;
    8. }
    9. return len;
    10. }
    11. //按值删除某个节点
    12. void DeleteElem(LinkList&L,ElemType e){
    13. if(L==NULL){
    14. printf("表为空!\n");
    15. return ;
    16. }
    17. int len=LinkListLength(L);
    18. //用来记录是否为尾节点
    19. LNode*p=L;
    20. LNode*r;
    21. while(p!=NULL){
    22. if(p->data==e){
    23. //处理只有一个节点的时候(特殊)
    24. if(len==1){
    25. free(p);
    26. L=NULL;
    27. return ;
    28. }else{
    29. //p->next==NULL表示为尾节点,所以要特殊处理
    30. if(p->next==NULL){
    31. LNode*s=p;
    32. r->next=NULL;
    33. free(s);
    34. return ;
    35. }else{
    36. LNode*s=p->next;
    37. ElemType temp=p->next->data;
    38. p->data=temp;
    39. p->next=s->next;
    40. free(s);
    41. return ;
    42. }
    43. }
    44. }
    45. r=p;
    46. p=p->next;
    47. }
    48. }
    49. //删除第i个节点
    50. void DeleteLNode(LinkList&L,int i,ElemType&e){
    51. if(L==NULL){
    52. printf("表为空!\n");
    53. return;
    54. }
    55. if(i<0||i>LinkListLength(L)){
    56. printf("删除的位置元素不合法!\n");
    57. return;
    58. }
    59. //特殊情况的处理
    60. LNode*p=L;
    61. if(LinkListLength(L)==1){
    62. free(p);
    63. L=NULL;
    64. return ;
    65. }
    66. int j=1;
    67. while(p!=NULL&&j
    68. p=p->next;
    69. j++;
    70. }
    71. e=p->data;
    72. LNode*s=p->next;
    73. ElemType temp=p->next->data;
    74. p->data=temp;
    75. p->next=s->next;
    76. free(s);
    77. return ;
    78. }

    (7)按值查询存在性和打印操作

    1. //按值查询节点的存在性
    2. bool FindLNodeExist(LinkList L,ElemType e){
    3. LNode*p=L;
    4. while(p!=NULL&&p->data!=e){
    5. p=p->next;
    6. }
    7. if(p==NULL){
    8. return false;
    9. }
    10. return true;
    11. }
    12. //打印操作
    13. void DisplayLinkList(LinkList L){
    14. LNode*p=L;
    15. while(p!=NULL){
    16. printf("%d\t",p->data);
    17. p=p->next;
    18. }
    19. printf("\n");
    20. }

    (8)主函数

    1. int main(){
    2. LinkList L;
    3. InitList(L);
    4. //对顺序表进行插入操作
    5. ElemType x;
    6. int flag=-1;
    7. int j=1;
    8. LNode*p=L;
    9. //各种操作
    10. while(1) {
    11. int i=0;
    12. ElemType e=0;
    13. MenuLinkList();
    14. printf("请输入操作: ");
    15. scanf("%d",&flag);
    16. int len=0;
    17. LNode*s;
    18. switch(flag){
    19. case 1:
    20. printf("请输入元素(-1_end): ");
    21. scanf("%d",&x);
    22. while(x!=-1) {
    23. //如果插入的是第一个节点,这需要进行特殊的处理
    24. if(j==1){
    25. p=InsertFisrtLNode(L,x);
    26. j++;
    27. }else{
    28. p=InsertNextNode(p,x);
    29. }
    30. printf("请输入元素(-1_end): ");
    31. scanf("%d",&x);
    32. }
    33. break;
    34. case 2:
    35. printf("请输入元素插入位置: \n");
    36. scanf("%d",&i);
    37. printf("请输入元素: ");
    38. scanf("%d",&x);
    39. ListInsert(L,i,x);
    40. break;
    41. case 3:
    42. printf("请输入查找元素位置: ");
    43. scanf("%d",&i);
    44. s=GetElem(L,i);
    45. if(s!=NULL){
    46. printf("查找的元素为 = %d\n",s->data);
    47. }
    48. break;
    49. case 4:
    50. printf("请输入要查找的值: ");
    51. scanf("%d",&x);
    52. if(FindLNodeExist(L,x)){
    53. printf("查找的元素存在!\n");
    54. }else{
    55. printf("查找的元素不存在!\n");
    56. }
    57. break;
    58. case 5:
    59. printf("请输入删除的定位位置: ");
    60. scanf("%d",&i);
    61. DeleteLNode(L,i,e);
    62. printf("删除的元素为 = %d\n",e);
    63. break;
    64. case 6:
    65. printf("请输入要删除的元素: ");
    66. scanf("%d",&e);
    67. DeleteElem(L,e);
    68. printf("删除成功!\n");
    69. break;
    70. case 7:
    71. DestryLinkList(L);
    72. printf("删除成功!\n");
    73. break;
    74. case 8:
    75. len=LinkListLength(L);
    76. printf("表的长度 = %d\n",len);
    77. break;
    78. case 9:
    79. DisplayLinkList(L);
    80. break;
    81. default:
    82. DestryLinkList(L);
    83. printf("结束操作\n");
    84. }
    85. if(flag==10){
    86. break;
    87. }
    88. }
    89. return 0;
    90. }

    (9)测试

     

     

     

     

     

     

  • 相关阅读:
    【三维重建NeRF(三)】Mip-NeRF论文解读
    hid-ft260驱动学习笔记 5 - ft260_i2c_probe
    API管理之利剑 -- Eolink
    PDF文件的页眉页脚无法删除的原因和三种替代方法
    Java中的字符串
    Microsoft SQL Server manual
    C++运算符重载
    unity打包工具
    一文2000字手把手教你基于Python的UI自动化测试自学路线
    Windows 下如何调试 PowerShell
  • 原文地址:https://blog.csdn.net/Keep_Trying_Go/article/details/126211534