无语了。。。 2022-08-23 00:44 采纳率: 100%
浏览 84
已结题

用c语言解决这个问题。

img


刚学数据结构(c语言版),不是特别明白,网课也没怎么看懂,自己敲了几个小时也没结果,希望能解答一下。

  • 写回答

4条回答 默认 最新

  • 摁回车的大雷 2022-08-23 08:46
    关注

    题主你好:

    img

    代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct node_t
    {
        int data;
        struct node_t* next;
    }LinkNode_t;
    
    LinkNode_t* createLinkList();
    int emptyLinkList(LinkNode_t* p);
    int lengthLinkList(LinkNode_t* p);
    int insertLinkList(LinkNode_t* p,int pos,int x);
    void printLinkList(LinkNode_t* p);
    int getLinkList(LinkNode_t* p,int pos);
    int deleteLinkList(LinkNode_t* p,int pos);
    void clearLinkList(LinkNode_t* p);
    void ReversePrintList(LinkNode_t* p);
    
    int main()    
    {    
        LinkNode_t* head = createLinkList();//创建一个链表的空头结点
        
        printf("(1)建立线性表(a,b,c,d,e,f,g,h,i,j)\n");    
        int i;
        for(i='a';i<='j';i++)
        {
            insertLinkList(head,i-'a',i);//在i-'a'位置插入i
        }                            //a,b,c,d,e,f,g,h,i,j
    
        printf("(2)把线性表的所有元素输出到屏幕上\n");    
        printLinkList(head);
    
        printf("(3)从线性表中输出元素g\n");
        printf("%c\n",getLinkList(head,6));
    
        printf("(4)在线性表的第5个元素前插入y元素\n");
        insertLinkList(head,4,'y');//插入y            //a,b,c,d,y,e,f,g,h,i,j
    
        printf("(5)从线性表中删除第三个元素并把它输出到屏幕上\n");
        printf("%c\n",getLinkList(head,2));        
        deleteLinkList(head,2);                    //a,b,d,y,e,f,g,h,i,j
    
        printf("(6)最后把线性表的所有元素再次输出到屏幕上\n");
        printLinkList(head);
    
    
        deleteLinkList(head,0);//删除链表
    
        return 0;
    }
    
    /*
     功能:创建一个链表的空头结点(堆空间)返回头结点的地址
     参数:新结点的值
     返回值:空链表的头结点指针
     */
    LinkNode_t* createLinkList()
    {
        LinkNode_t* node =(LinkNode_t*)malloc(sizeof(LinkNode_t));
        node->next = NULL;
        return node;
    }
    
    /* 
    功能:判断链表是否为空
    参数:链表头结点指针
    返回值:空返回1 非空返回0
    */
    int emptyLinkList(LinkNode_t* p)
    {
        return p->next == NULL;
    }
    
    /*
     功能:计算链表中除空头结点之外的结点个数
     参数:链表头结点指针
     返回值:结点个数
     */
    int lengthLinkList(LinkNode_t* p)
    {
        int count = 0;
        LinkNode_t* t = p->next;
        while(t!=NULL)
        {
            count++;
            t = t->next;
        }
        return count;
    }
    
    /*
    功能:在链表中插入新结点并存入数据
    参数1:链表头结点指针
    参数2:插入的位置(第一个有数据的结点位置为0)
    参数3:新结点的值
    返回值:成功返回0 失败返回-1
    */
    int insertLinkList(LinkNode_t* p,int pos,int x)
    {
        if(pos<0||pos>lengthLinkList(p))
        {    
            return -1;
        }
        LinkNode_t* newNode = (LinkNode_t*)malloc(sizeof(LinkNode_t));
        newNode->data = x;//赋值
        newNode->next = NULL;
    
        LinkNode_t* t=p;//指向空头,从空头开始遍历
        int i;
        for(i = 0;i < pos;i++)
        {
            t = t->next;
        }
        //将结点插入链表
        newNode->next = t->next;
        t->next = newNode;
        return 0;
    }
    /*
    功能:获得链表中某结点的值
    参数1:链表头结点指针
    参数2:位置(第一个有数据的结点位置为0)
    返回值:失败返回-1 成功返回参数2位置结点的值
    */
    int getLinkList(LinkNode_t* p,int pos)
    {
        if(pos<0||pos>lengthLinkList(p))
        {
            return -1;
        }
        int i;
        LinkNode_t* t = p->next;
        for(i=0;i<pos;i++)
        {
            t = t->next;
        }
        return t->data;
    }
    
    /*
    功能:遍历输出链表中结点的值
    参数:链表头结点指针
    返回值:无
    */
    void printLinkList(LinkNode_t* p)
    {
        printf("有效数据结点数:%d\n",lengthLinkList(p));
        int count = 0;
        LinkNode_t* t = p->next;
        while(t!=NULL)
        {
            printf("NODE[%d]:%c\n",count,t->data);
            t = t->next;
            count++;
        }
    }
    /*
    功能:删除参数位置结点
    参数1:链表头结点指针
    参数2:删除位置
    返回值:失败返回-1 成功返回0
    */
    int deleteLinkList(LinkNode_t* p,int pos)
    {
        if(pos<0||pos>=lengthLinkList(p))
        {
            return -1;
        }
        int i;
        LinkNode_t* t = p;//指向空头
        for(i=0;i<pos;i++)
        {
            t = t->next;
        }
        LinkNode_t* s = t->next;//保存要删除结点的地址
        t->next = t->next->next;//连接待删除结点的前后两个结点
        free(s);
        return 0;
    }
    
    /*
    功能:清空链表
    参数:链表头结点指针
    */
    void clearLinkList(LinkNode_t* p)
    {
        while(p!=NULL)
        {
            LinkNode_t* t = p;
            p = p->next;
            free(t);
        }
    }
    /*
    功能:反向打印链表
    参数:链表头结点指针
    */ 
    void ReversePrintList(LinkNode_t* p)
    {
        static int count=0;
        if(p->next!=NULL)
        {
            count++;
            ReversePrintList(p->next);
            count--;
            printf("NODE[%d]:%d\n",count,p->next->data);
            return;
        }
        return;
    }
    
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月31日
  • 已采纳回答 8月23日
  • 创建了问题 8月23日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度