在链表中如何检查是否输入重复

struct goods
{
    int bianhao;
    char pinming[20];
    float jinjia;
    float shoujia;
    int jinhuoliang;
    char changjia[20];
    int cangku;
};

struct Node
{
    struct goods data;
    struct Node* next;
};

struct Node* head;
struct Node* create();
void input();
void addgoods();
void delgoods();
void changegoods();
void viewgoods();
void search();

//省略了一部分无关紧要的代码

void input()
{
    FILE* fp;
    struct goods SP;
    char m;
    printf("录入\n");
    printf("请输入要录入商品信息\n");
    printf("*************************\n");
    fp = fopen("D:\\file1.dat", "wb");
    if (fp == NULL)
    {
        printf("文件打开失败\n");
        exit(0);
    }
    fclose(fp);
    while (1)
    {
        printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
        printf("        请输入商品编号\n");
        printf("┠━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┨\n");
        scanf("%d", &SP.bianhao);
                             
                                    

我想要在输入了重复商品编号的时候,程序能够提醒我,并让我重新输入

你可再增加一个方法,这个方法遍历链表,检查输入的商品在链表中是否存在。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7549273
  • 你也可以参考下这篇文章:给定输入字符串的数量并且输入该数量的字符串,统计其中数字字符的数量
  • 除此之外, 这篇博客: 关于函数指针以及由函数指针引起的混乱中的  【我的问题】 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •         上面我们指出函数名是一个指针变量,这个指针变量指向函数体,那么为什么会出现这样的输出结果呢?

            希望有大佬在评论区发表自己的意见,这个问题我不理解,求助!!!!

    #include <stdio.h>
    
    int max(int a, int b)
    {
    	return a > b ? a : b;
    }
    
    
    int main(void)
    {
    	int a, b;
    	scanf("%d %d", &a, &b);
    
    	int (*pmax)(int a, int b) = max;
    
    	printf("%p\n", max);
    	printf("%p\n", &max);
    	printf("%p\n", pmax);
    	printf("%p\n", &pmax);
    
    
    	return 0;
    }
    
    

     

                为什么 max 和 &max的结果一样呢?难道 max 不应该是一个指针变量嘛?

                经过我一晚上的胡思乱想,我有了一个不太成熟的想法,来解释这个问题:

           当创建一个数组的时候,会为其分配一段连续的存储空间,同时利用一个数组名来指向该数组的首地址,我们把这个数组名称为数组变量。

            需要注意的的是,内存并不会为数组变量分配存储空间这也是为什么数组名不能指向其他地方,而指针变量可以指向其他地方,因为内存为指针变量分配了存储空间。那么我们是不是可以认为,函数名是一种特殊的指针变量,内存同样不会对其分配存储空间,这也是为什么函数名不能指向其他地方。

            我们发现这两者存在极大的相似之处,所以我提出了这样一个想法,函数变量(函数名)与数组变量(数组名)相似,在进行编译的时候,系统会把函数名和数组名出现的地方直接替换成函数或者数组的首地址!!!那么这里是不是又是一个特殊的发现?进行替换?是否与宏定义相关?

            所以函数变量和数组变量是不是一种特殊的宏定义?????

     

     希望有大神指正!!!

  • 您还可以看一下 郑逊敏老师的抖音快手短视频自媒体制作引流运营兼职创业赚钱盈利实战教程课程中的 巧妙借势热点,实现快速涨粉小节, 巩固相关知识点

这么写,供参考:

#include <stdio.h>
#include <stdlib.h>
struct goods
{
    int bianhao;
    char pinming[20];
    float jinjia;
    float shoujia;
    int jinhuoliang;
    char changjia[20];
    int cangku;
};
struct Node
{
    struct goods data;
    struct Node* next;
};

struct Node* head=NULL;
struct Node* create();
void input();
void addgoods();
void delgoods();
void changegoods();
void viewgoods();
void search();

int  search(int bianhao); //修改

//省略了一部分无关紧要的代码

void input()
{
    FILE* fp;
    struct goods SP;
    char m;
    printf("录入\n");
    printf("请输入要录入商品信息\n");
    printf("*************************\n");
    //fp = fopen("D:\\file1.dat", "wb");
    //if (fp == NULL)
    //{
    //    printf("文件打开失败\n");
        //exit(0);
    //}
    //fclose(fp);
    while (1)
    {
        printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
        printf("        请输入商品编号\n");
        printf("┠━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┨\n");
        do{                            //修改
            scanf("%d", &SP.bianhao); 
            if (search(SP.bianhao))     //修改
                printf("商品编号: %d 已存在,请重新输入:",SP.bianhao); //修改
            else                       //修改
                break;                 //修改
        }while (1);                    //修改
        //.......
        //.......
    }
}

int  search(int bianhao) //添加
{
    struct Node*p = head;
    while (p){
        if (p->data.bianhao == bianhao)
            return 1;
        p = p->next;
    }
    if (!p)
        return 0;
}