This implies that data member name is a char array of size 1 i.e. it can only take one character (which is the max size a char type variable would take anyway). So having a char array of size 1 is redundant and also perhaps what you may not be looking for if this member has to describe the name of the product, so suggest you replace it with std::string name instead which would be more descriptive.
Also you're using goto repeatedly in your program, see here for some advice cautioning against such use: https://www.tutorialspoint.com/cplusplus/cpp_goto_statement.htm
you can instead write the same program using switch-case that'd offer the same functionality while helping you retain greater control over your program
Now, in terms of deleting a product first you have to find it and to find it you have to decide a unique way of identifying it – looking at struct products, perhaps int productID is the most likely candidate. Below is a stylized example that uses only 5 products and attempts to delete the product with id == 3 from the C-style array of products. It'd be much simpler if you could have used std::vector<products> instead. Finally note in the following program I'd be declaring the custom datatype products as 'Product' instead, using upper-case and singular to describe a generic product and lower-case to describe instances of this generic product:
To update the products you proceed in exactly the same way – find the product with std::find_if, then dereference the iterator returned by std::find_if to reach the underlying product object and make changes to it's data-members
i was working on this (but as a class exercise :D) but I am guessing your explanation will be much more useful. However, as I did this as my first (almost ever) class can you tell me what do you think? I know is not perfect ;) far from it.
I will post this in separate thread so not to overtake this one :)