m0_73771301 2022-11-22 11:01 采纳率: 81.8%
浏览 9
已结题

熟练进行链表的基本操作,编程实现动态链表的建立 插入 删除和输出操作这个实验不怎么会

熟练进行链表的基本操作,编程实现动态链表的建立 插入 删除和输出操作
这个实验不怎么会,想问问朋友们

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-11-22 13:31
    关注

    供参考:

    #include <malloc.h>
    #include <stdio.h>
    typedef int ElemType;
    typedef struct node
    {
        ElemType  data; //数据域
        struct node* next; //指针域
    } SLinkNode; //单链表类型
    
    void DestroyList(SLinkNode*& L) //销毁单链表L
    {
        SLinkNode* pre = L, * p = pre->next;
        while (p != NULL)
        {
            free(pre);
            pre = p;
            p = p->next; 
        }
        free(pre);
    }
    int GetLength(SLinkNode* L) //求单链表L的长度
    {
        int i = 0;
        SLinkNode* p = L->next;
        while (p != NULL)
        {
            i++;
            p = p->next;
        }
        return i;
    }
    int GetElem(SLinkNode* L, int i, ElemType& e) //求第i个结点值e
    {
        int j = 0;
        SLinkNode* p = L; //p指向头结点,计数器j置为0
        if (i <= 0) return 0; //参数i错误返回0
        while (p != NULL && j < i)
        {
            j++;
            p = p->next;
        }
        if (p == NULL)
            return 0; //未找到返回0
        else
        {
            e = p->data;
            return 1; //找到后返回1
        }
    }
    int Locate(SLinkNode* L, ElemType e) //求第一个值为e的结点的逻辑序号
    {
        SLinkNode* p = L->next;
        int j = 1; //p指向第一个数据结点,j置为其序号1
        while (p != NULL && p->data != e)
        {
            p = p->next;
            j++;
        }
        if (p == NULL) return(0); //未找到返回0
        else return(j); //找到后返回其序号
    }
    int InsElem(SLinkNode*& L, ElemType x, int i) //插入结点值为x的结点
    {
        int j = 0;
        SLinkNode* p = L, * s;
        if (i <= 0) return 0; //参数i错误返回0
        while (p != NULL && j < i - 1) //查找第i-1个结点*p
        {
            j++;
            p = p->next;
        }
        if (p == NULL)
            return 0; //未找到第i-1个结点时返回0
        else //找到第i-1个结点p
        {
            s = (SLinkNode*)malloc(sizeof(SLinkNode));
            s->data = x; //创建存放元素x的新结点s
            s->next = p->next; //将s结点插入到p结点之后
            p->next = s;
            return 1; //插入运算成功,返回1
        }
    }
    int DelElem(SLinkNode*& L, int i) //删除第i个结点
    {
        int j = 0;
        SLinkNode* p = L, * q;
        if (i <= 0) return 0; //参数i错误返回0
        while (p != NULL && j < i - 1) //查找第i-1个结点
        {
            j++;
            p = p->next;
        }
        if (p == NULL)
            return 0; //未找到第i-1个结点时返回0
        else //找到第i-1个结点p
        {
            q = p->next; //q指向被删结点
            if (q == NULL)
                return 0; //没有第i个结点时返回0
            else
            {
                p->next = q->next; //从单链表中删除q结点
                free(q); //释放其空间
                return 1;
            }
        }
    }
    void DispList(SLinkNode* L) //输出单链表
    {
        SLinkNode* p = L->next;
        while (p != NULL)
        {
            printf("%d ", p->data);
            p = p->next;
        }
        printf("\n");
    }
    //采用头插法建表的算法
    void CreateListF(SLinkNode*& L, ElemType a[], int n)
    {
        SLinkNode* s;
        int i;
        L = (SLinkNode*)malloc(sizeof(SLinkNode)); //创建头结点
        L->next = NULL; //头结点的next域置空,表示一个空单链表
        for (i = 0; i < n; i++) //遍历a数组所有元素
        {
            s = (SLinkNode*)malloc(sizeof(SLinkNode));
            s->data = a[i]; //创建存放a[i]元素的新结点s
            s->next = L->next; //将s插在头结点之后
            L->next = s;
        }
    }
    //采用尾插法建表的算法
    void CreateListR(SLinkNode*& L, ElemType a[], int n)
    {
        SLinkNode* s, * tc;
        int i;
        L = (SLinkNode*)malloc(sizeof(SLinkNode)); //创建头结点
        tc = L; //tc始终指向尾结点,开始时指向头结点
        for (i = 0; i < n; i++)
        {
            s = (SLinkNode*)malloc(sizeof(SLinkNode));
            s->data = a[i]; //创建存放a[i]元素的新结点s
            tc->next = s; //将s插入tc之后
            tc = s;
        }
        tc->next = NULL; //尾结点next域置为NULL
    }
    int main()
    {
        SLinkNode* L = NULL, * L1 = NULL;
        ElemType n, a[20] = { 0 }, i, e;
        scanf("%d", &n);
        for (i = 0; i < n; i++)//1)输入一组长度不超过20的整数元素
            scanf("%d", &a[i]);
    
    
        //***使用头插法建立一个带头结点的单链表***
        CreateListF(L, a, n);//1)使用头插法建立一个带头结点的单向链表
        printf("L:");
        DispList(L);         //2)显示单链表
        printf("L的长度:%d\n", GetLength(L)); //2)显示单链表的长度
        i = 3;
        GetElem(L, i, e);
        printf("第%d个位置的值:%d\n", i, e); //3)显示第3个位置的值
        e = 5;
        printf("元素%d的位置:%d\n", e, Locate(L, e));//3)显示链表中某个元素是第几个位置
        i = 4; e = 10;
        DelElem(L, i);  //4)删除第4个位置元素
        InsElem(L, e, i);//4)往第4个位置插入元素10
        printf("L:");
        DispList(L);   //4)显示单链表
    
    
        //***使用尾插法建立一个带头结点的单链表***
        printf("\n");
        CreateListR(L1, a, n);//1)使用尾插法建立一个带头结点的单向链表
        printf("L1:");
        DispList(L1);         //2)显示单链表
        printf("L1的长度:%d\n", GetLength(L1)); //2)显示单链表的长度
        i = 3;
        GetElem(L1, i, e);
        printf("第%d个位置的值:%d\n", i, e); //3)显示第3个位置的值
        e = 5;
        printf("元素%d的位置:%d\n", e, Locate(L1, e));//3)显示链表中某个元素是第几个位置
        i = 4; e = 10;
        DelElem(L1, i);  //4)删除第4个位置元素
        InsElem(L1, e, i);//4)往第4个位置插入元素10
        printf("L1:");
        DispList(L1);   //4)显示单链表
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月7日
  • 已采纳回答 11月29日
  • 创建了问题 11月22日

悬赏问题

  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥50 我撰写的python爬虫爬不了 要爬的网址有反爬机制
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等