• 使用C语言实现静态链表


    目录

    1.静态链表

    2.静态链表的相关操作

    (1)数据结构

    (2)初始化操作

    (3)分配空闲节点

    (4)释放节点(回收)

    (5)插入节点

    (6)在第i个位置处插入节点

    (7)删除第i个节点

    (8)定位元素和打印

    (9)主函数

    (10)测试


    1.静态链表

    单链表是不要求地址是连续的,也就是各个节点之间是离散的分布在内存中的。

    静态链表则是分配一整片连续的内存空间,各个节点的地址是连续的,集中存放。

    注:静态链表也是通过遍历查找到删除的节点位置和插入节点的位置。

    其中上面的空闲表头的指针域为6,表示指向的数组下标为6的位置空闲;而头结点的指针域为2,表示头结点的下一个节点在数组下标为2的地方。

    2.静态链表的相关操作

    (1)数据结构

    1. #include
    2. #include
    3. #define MAXSIZE 10
    4. typedef int ElemType;
    5. typedef struct Node {
    6. ElemType data;
    7. int cur;
    8. }SLinkList[MAXSIZE];

    (2)初始化操作

    注:这里的空闲表头指针指向的是下一个空闲的位置,在申请节点空间的时候只需要找到空闲表头指针指向的位置即可。

    1. //初始化
    2. void InitSLinkList(SLinkList&space,ElemType&headNode){
    3. //初始化游标
    4. for(int i=0;i-1;i++){
    5. space[i].cur=i+1;
    6. }
    7. //确定链尾
    8. space[MAXSIZE-1].cur=0;
    9. //申请头结点
    10. headNode=MallocSLinkList(space);
    11. }

    (3)分配空闲节点

    1. //判断备用空间链表非空,则返回分配的节点下标,否则返回0
    2. int MallocSLinkList(SLinkList&space){
    3. //从头结点开始
    4. int i=space[0].cur;
    5. if(space[0].cur){
    6. space[0].cur=space[i].cur;
    7. }
    8. return i;
    9. }

    (4)释放节点(回收)

    比如现在释放节点a5,其数组下标为7,那么k=7:

    (1)首先是将数组下标为7的位置的指针域修改为空闲表头指针指向的空闲位置:space[7].cur=space[0].cur=6;

    (2)其次是将空闲表头的指针域修改为刚才释放的节点位置:space[0].cur=7.

    1. //将空闲节点收回到备用链表
    2. void FreeSLinkList(SLinkList&space,int k){
    3. space[k].cur=space[0].cur;
    4. space[0].cur=k;
    5. }

    (5)插入节点

    1. //创建一个静态链表
    2. int CreateList(SLinkList&space,ElemType e,int j){
    3. int k=j;
    4. //申请空间
    5. int r=MallocSLinkList(space);
    6. //将节点插入到r位置
    7. space[r].data=e;
    8. //将前驱指针k指向r
    9. space[k].cur=r;
    10. //移动指针k到r位置
    11. k=r;
    12. space[k].cur=0;
    13. printf("插入节点成功!\n");
    14. return k;
    15. }

    (6)在第i个位置处插入节点

    1. //查找第i-1节点
    2. int FindNode(SLinkList&space,int i,int headNode){
    3. if(i<1||i>MAXSIZE){
    4. printf("插入位置不合法!\n");
    5. return -1;
    6. }
    7. int k=headNode;
    8. int j=0;
    9. //从头结点开始找到第i-1指针指向的位置
    10. while(k!=0&&j-1){
    11. j++;
    12. k=space[k].cur;
    13. }
    14. return k;
    15. }
    16. //在第i个节点之前插入节点e
    17. void InsertNode(SLinkList&space,int headNode,int i,ElemType e){
    18. int k=FindNode(space,i,headNode);
    19. if(k==0)return;
    20. int m=MallocSLinkList(space);
    21. if(m!=0){
    22. //将节点e插入到位置k后
    23. space[m].data=e;
    24. //将m的指针指向k的指针后继
    25. space[m].cur=space[k].cur;
    26. //将k指针指向m
    27. space[k].cur=m;
    28. printf("插入节点成功!\n");
    29. return ;
    30. }else{
    31. printf("插入节点失败!\n");
    32. return ;
    33. }
    34. }

    (7)删除第i个节点

    1. //删除节点
    2. void DeleteNode(SLinkList&space,int headNode,int i,ElemType&e){
    3. int k=FindNode(space,i,headNode);
    4. if(k==0)return;
    5. int m=space[k].cur;
    6. //将k指针指向m指针的后继
    7. space[k].cur=space[m].cur;
    8. //获取要删除的元素
    9. e=space[m].data;
    10. //释放
    11. FreeSLinkList(space,m);
    12. printf("删除节点成功!\n");
    13. return ;
    14. }

    (8)定位元素和打印

    1. //定位元素的位置
    2. int LocateElem(SLinkList space,ElemType e,int headNode){
    3. int i=space[headNode].cur;
    4. while(i&&space[i].data!=e){
    5. i=space[i].cur;
    6. }
    7. return i;
    8. }
    9. //打印操作
    10. void PrintSLinkListNode(SLinkList space,int headNode){
    11. int i=space[headNode].cur;
    12. while(i!=0){
    13. printf("%d\t",space[i].data);
    14. i=space[i].cur;
    15. }
    16. printf("\n");
    17. }

    (9)主函数

    1. int main(){
    2. SLinkList space;
    3. int i;
    4. int j;
    5. ElemType e;
    6. ElemType headNode;
    7. InitSLinkList(space,headNode);
    8. j=headNode;
    9. while(1){
    10. int flag=0;
    11. MenuSLinkList();
    12. printf("请输入操作: ");
    13. scanf("%d",&flag);
    14. switch(flag){
    15. case 1:
    16. InitSLinkList(space,headNode);
    17. printf("初始化成功!\n");
    18. break;
    19. case 2:
    20. printf("请输入元素(-1_end): ");
    21. scanf("%d",&e);
    22. while(e!=-1){
    23. j=CreateList(space,e,j);
    24. printf("请输入元素(-1_end): ");
    25. scanf("%d",&e);
    26. }
    27. break;
    28. case 3:
    29. printf("请输入插入的位置: ");
    30. scanf("%d",&i);
    31. printf("请输入插入的值: ");
    32. scanf("%d",&e);
    33. InsertNode(space,headNode,i,e);
    34. break;
    35. case 4:
    36. printf("请输入删除的节点位置: ");
    37. scanf("%d",&i);
    38. DeleteNode(space,headNode,i,e);
    39. printf("删除的节点 = %d\n",e);
    40. break;
    41. case 5:
    42. PrintSLinkListNode(space,headNode);
    43. break;
    44. default:
    45. printf("结束操作\n");
    46. }
    47. if(flag==6){
    48. break;
    49. }
    50. }
    51. return 0;
    52. }

    (10)测试

  • 相关阅读:
    网络安全(黑客)—2024自学
    如何理解Python中的self变量?
    Android对接华为AI - 文本识别
    【PG】PostgreSQL客户端认证pg_hba.conf文件
    文件系统之软连接、硬链接的区别/文件删除与空间的联系/df和du的区别
    字符串的基本运用
    yocto meta-st-stm32mp conf文件夹分析
    新设备的idea编辑器导入旧设备的配置
    领导提拔项目经理,看的从来不是努力
    MySQL之DQL
  • 原文地址:https://blog.csdn.net/Keep_Trying_Go/article/details/126236486