程序设计题:单链表实验

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

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

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;
        }
    }

}