完成单链表的基本操作方法

1.产生20个1~200的随机数,并依次保存到带头结点的单链表中
2.计算单链表长度,并将结果存放在头结点的数据域中,然后输出单链表
3.能按值查找,按位查找
4.从单链表中删除与给定值x相等的所有结点,然后输出单链表

#include <stdio.h>
#include <time.h>
#include <stdlib.h>



//1.产生20个1~200的随机数,并依次保存到带头结点的单链表中
//2.计算单链表长度,并将结果存放在头结点的数据域中,然后输出单链表
//3.能按值查找,按位查找
//4.从单链表中删除与给定值x相等的所有结点,然后输出单链表

typedef struct _Node
{
    int data;
    struct _Node *next;
}Node;

void printList(Node *head)
{
    Node *p = head->next;
    while(p != NULL)
    {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}

void findIdx(Node *head,int data)
{
    int idx = 0;
    Node *p = head->next;
    while(p!=NULL)
    {
        if(p->data == data)
        {
            printf("%d是第%d个节点\n",data,idx+1);
            return;
        }
        p=p->next;
        idx++;
    }
    printf("不存在值为%d的节点\n",data);
}

void findData(Node *head,int idx)
{
    int i=1;
    Node *p = head->next;
    while(p != NULL && i<idx)
    {
        p = p->next;
        i++;
    }
    if(i==idx)
    {
        printf("第%d个节点的值为%d\n",idx,p->data);
    }
    else
        printf("没有第%d个节点\n",idx);
}

void remove(Node *head,int x)
{
    Node *p = head;
    while(p->next != NULL)
    {
        if(p->next->data == x)
        {
            Node *q = p->next;
            p->next = p->next->next;
            free(q);
            head->data--;
        }
        else
            p = p->next;
    }
}

void createList(Node *head)
{
    Node *p = head;
    Node *q = NULL;
    for(int i=0;i<20;i++)
    {
        q = (Node*)malloc(sizeof(Node));
        q->data = rand()%200+1;
        q->next = NULL;
        p->next = q;
        p = p->next;
    }
    head->data = 20;
}
int getNodeCount(Node *head)
{
      return head->data;
}

int main()
{
    Node head;
    head.data = 0;
    head.next = NULL;
    //
    srand((unsigned int)time(NULL));
    createList(&head);
    printList(&head);
    //
    int idx;
    printf("输入搜索的节点序号(从1开始):");
    scanf("%d",&idx);
    findData(&head,idx);
    int data;
    printf("输入搜索的值:");
    scanf("%d",&data);
    findIdx(&head,data);
    //
    printf("输入删除的值:");
    scanf("%d",&data);
    remove(&head,data);
    printList(&head);
    printf("节点数量:%d\n",head.data);
    return 0;
}