XYKanade 2022-01-03 16:32 采纳率: 100%
浏览 134
已结题

程序设计题:单链表实验

1.从键盘输入若千大于0的整数,用这些整数构造一个单链表.当用户输入小于等于0的值时,创建链表结束并在终端打印输出这个链表。
2.在链表中查找某结点,如果能找到输出这个结点是第几个结点,如果找不到,输出:找不到此结点。
3.删除指定结点:如果指定的被删除结点存在就删除它,然后打印:已经删除,如果不存在,输出信息:链表中没有此结点,无法删除。
4.删除重复结点:如果链表中有重复的元素,删除重复的元素,使得所有值最多只出现一次,例如,如果链表中有3个结点的值是100,那么需要删除两个值为100的结点。只保留一个值为100的结点。删除重复结点后打印输出整个链表

  • 写回答

1条回答 默认 最新

  • fuill 2022-01-03 19:24
    关注

    功能全部完成,有帮助请采纳!

    img

    
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct link_list
    {
        int num;
        struct link_list* next;
    } STU;
    void creat(STU* head)//(创建链表)
    {
        int n=1;
        STU* p = NULL, * q = head;
        while (n >= 0)
        {
            scanf("%d", &n);
            if(n<0)
            {
                break;
            }
            else
            {
                p = (STU*)malloc(sizeof(STU)+1);
                p->next=NULL;
                p->num = n;
                q->next = p;
                q = p;
            }
    
        }
        q->next = NULL;
    }
    void print(STU* head)//(输出链表)
    {
        STU* p=head->next;
        while (p)
        {
            printf("%d  ", p->num);
            p = p->next;
        }
    }
    int search(STU* head, int n)
    {
        int j;
        STU *p;
        p=head->next;
        j=1;
    
        while (p!= NULL)
        {
            if (p->num == n)
            {
                printf("该结点位于第%d个\n",j);
                return j;
            }
            p = p->next;
            j++;
        }
        printf("找不到此结点。");
        return -1;
    }
    
    void charu(STU* list, int n)
    {
        STU *t = list, *in;
        int i = 0;
        while (i < n && t != NULL)
        {
            t = t->next;
            i++;
        }
        if (t != NULL)
        {
            in = (STU*)malloc(sizeof(STU));
            puts("输入要插入的值");
            scanf("%d", &in->num);
            in->next = t->next;//填充in节点的指针域,也就是说把in的指针域指向t的下一个节点
            t->next = in;//填充t节点的指针域,把t的指针域重新指向in
        }
        else
        {
            puts("找不到此结点");
        }
    
    
    }
    
    void deleted(STU* head, int n)//删除链表(输入学号)
    {
    
    
        STU *t = head, *in;
        int i = 0;
        while (i < n && t != NULL)
        {
            in = t;
            t = t->next;
            i++;
        }
        if (t != NULL)
        {
            in->next = t->next;
            free(t);
        }
        else
        {
            puts("链表中没有此结点,无法删除。");
        }
    
        /*STU* p = head->next;
        while (p && p->num != n)
        {
            head = p, p = p->next;
        }
        if (p)
        {
            head->next = p->next;
            free(p);
        }
        print(head);*/
    
    }
    int t=0;
    void dere(STU* head)
    {
        STU *d=head->next,*p=head->next,*q;
        while(d!=NULL)//删除操作
        {
            p=d;
            q=p->next;//q指向待删除结点
            while(q!=NULL)
            {
                if(d->num==q->num)
                {
                    t++;//删除数的次数
                    p->next=q->next;//p指向q的下一个结点,删除结点q
                    q=q->next;
                }
                else
                {
                    p=q;
                    q=q->next;
                }
            }
            d=d->next;
        }
    }
    int main()
    {
        STU* head = (STU*)malloc(sizeof(STU));
        int c=250;
        puts("请输入数值,-1结束:"); 
        creat(head);
        while(c--)
        {
            printf("\n输出链表请扣1\n链表删除重复数值请扣2\n链表查找请扣3\n链表删除请扣4\n输入-1结束\n");
            int requst, n;
            scanf("%d", &requst);
            switch (requst)
            {
                case 1:
                    print(head);
                    break;
                case 2:
                    dere(head);
                    puts("删除重复数值后:");
                    print(head);
                    break;
                case 3:
                    puts("请输入要查找的值:"); 
                    scanf("%d", &n);
                    search(head, n);
                    break;
                case 4:
                    puts("请输入要删除的值:");
                    scanf("%d", &n);
                    deleted(head, n);
                    printf("删除%d数值后:\n",n);
                    print(head);
                    break;
                default :
                    break;
            }
            if(n==-1)
            {
                break;
            }
        }
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月12日
  • 已采纳回答 1月4日
  • 创建了问题 1月3日

悬赏问题

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