Faits :
A.
Par jugement du 5 novembre 2015, le Tribunal de police du Littoral et du Val-de-Travers a condamné X._, pour infractions à la LCR et contraventions à la LStup, à une peine privative de liberté de neuf mois ainsi qu'à une amende de 1'000 francs. Il a ordonné la confiscation et la réalisation des véhicules A._ châssis no xxx, B._, B._ châssis no yyy et C._ séquestrés en cours d'enquête et a dit que le solde du produit de la réalisation revient au prénommé, après imputation des frais de réalisation, d'entreposage, des frais de procédure et de l'amende.
B.
Par jugement du 8 novembre 2018, la Cour pénale du Tribunal cantonal de la République et canton de Neuchâtel n'est pas entrée en matière sur l'appel formé par D._, n'est pas entrée en matière sur l'appel joint formé par X._, a admis l'appel formé par E._, a rejeté l'appel formé par F._ et a pris acte du retrait de l'appel formé par G._ contre ce jugement. Elle a réformé celui-ci en ce sens que la restitution du véhicule A._ châssis no xxx à E._ est ordonnée et a confirmé le jugement pour le surplus.
Par arrêts du 19 février 2019 (6B_11/2019 et 6B_12/2019), le Tribunal fédéral a déclaré irrecevables les recours formés par E._, respectivement par F._, contre le jugement du 8 novembre 2018.
C.
X._ forme un recours en matière pénale au Tribunal fédéral contre le jugement du 8 novembre 2018 en concluant, avec suite de frais et dépens, à son annulation et au renvoi de la cause à l'autorité précédente pour nouvelle décision. Il sollicite par ailleurs l'octroi de l'effet suspensif ainsi que le bénéfice de l'assistance judiciaire.
D.
Invités à se déterminer sur le recours, la cour cantonale s'est référée à son jugement, tandis que le ministère public a renoncé à formuler des observations.

Considérant en droit :
1.
Le recourant fait grief à la cour cantonale d'avoir violé l'<ref-law> en refusant d'entrer en matière sur son appel joint.
1.1. L'<ref-law> prévoit que l'art. 399 al. 3 et 4 CPP s'applique par analogie à l'appel joint (al. 1); l'appel joint n'est pas limité à l'appel principal, sauf si celui-ci porte exclusivement sur les conclusions civiles du jugement (al. 2); si l'appel principal est retiré ou fait l'objet d'une décision de non-entrée en matière, l'appel joint est caduc (al. 3).
Dans un arrêt publié aux <ref-ruling>, le Tribunal fédéral a retenu, en substance, que, quand bien même l'appel joint n'est pas lié à l'appel principal, son caractère accessoire impose toutefois de prendre en compte quelles parties sont aux prises et justifie une délimitation par rapport aux parties concernées. Lorsque l'appel principal émane d'une partie plaignante, le cadre dans lequel l'appel joint est possible sur le plan pénal se détermine en considération des infractions par lesquelles la partie plaignante est directement lésée (cf. <ref-law>). Les parties concernées par l'appel principal sont ainsi définies et l'appel joint doit se situer dans ce cadre. Le caractère accessoire de l'appel joint implique qu'il n'a pas de portée indépendante par rapport à l'appel principal (consid. 2.3 p. 95 s.; cf. <ref-ruling> consid. 1.2 p. 236). Les limites posées par la jurisprudence et la doctrine portent uniquement sur le cercle des personnes concernées par la procédure d'appel. On ne saurait en déduire, sous peine de vider de son sens l'<ref-law>, que l'appel joint ne peut pas porter sur d'autres faits ou d'autres points de droit que ceux attaqués par l'appel principal. Autrement dit, l'appel joint n'est pas dépendant des griefs soulevés dans l'appel principal (cf. arrêt 6B_1249/2015 du 7 juillet 2016 consid. 1.2.2 et les références citées).
Aux termes de l'art. 105 al. 1 let. f CPP, participent notamment à la procédure les tiers touchés par des actes de procédure. Lorsque des participants à la procédure visés à l'<ref-law> sont directement touchés dans leurs droits, la qualité de partie leur est reconnue dans la mesure nécessaire à la sauvegarde de leurs intérêts (<ref-law>).
1.2. L'autorité précédente a exposé que E._, F._, D._ et G._ avaient formé chacun un appel contre le jugement du 5 novembre 2015. Ces appels portaient uniquement sur la question de la confiscation et de la réalisation des véhicules séquestrés. Dans son appel joint, le recourant avait remis en question les infractions retenues à son encontre et la quotité de la peine. Selon la cour cantonale, le recourant et les autres appelants n'étaient pas des parties adverses, de sorte que l'intéressé ne pouvait pas déposer un appel joint.
1.3. En l'espèce, les appels formés par D._, E._, F._ et G._ portaient tous sur la question de la confiscation et de la réalisation de véhicules séquestrés dans le cadre de l'instruction. L'appel joint du recourant visait quant à lui à contester la réalisation de certaines infractions pour lesquelles il avait été condamné ainsi qu'à mettre en cause la peine prononcée et son mode d'exécution.
On peut tout d'abord relever que le recourant disposait d'un intérêt juridiquement protégé - au sens de l'<ref-law> - à l'annulation ou à la modification du jugement de première instance s'agissant des aspects mis en cause dans son appel joint (cf. sur ce point MOREILLON/PAREIN-REYMOND, Petit commentaire, Code de procédure pénale, 2e éd. 2016, n° 13 ad <ref-law>; MARLÈNE KISTLER VIANIN, in Commentaire romand, Code de procédure pénale suisse, 2011, n° 7 ad <ref-law>).
Par ailleurs, dès lors que les appels principaux portaient tous sur les conséquences accessoires - au sens de l'art. 399 al. 4 let. e CPP - du jugement de première instance et non exclusivement sur des conclusions civiles, un éventuel appel joint du recourant n'était pas limité à l'étendue desdits appels principaux (cf. <ref-law> a contrario).
Il reste dès lors à déterminer si le cercle des personnes concernées par la procédure d'appel pouvait, au regard des principes développés par la jurisprudence (cf. consid. 1.1 supra), exclure ou au contraire autoriser le recourant à former son appel joint. D._, E._, F._ et G._ ont formé appel en qualité de tiers touchés par des actes de procédure (cf. art. 105 al. 1 let. f CPP). Dès lors que G._ a retiré son appel et que la cour cantonale n'est pas entrée en matière sur l'appel formé par D._, l'appel joint du recourant était de toute manière caduc concernant les deux prénommés.
Les appels formés par E._ et F._ portaient quant à eux sur la revendication des véhicules A._ châssis no xxx, respectivement C._. Le recourant a été condamné, par le tribunal de première instance, pour diverses infractions commises à bord de ces deux automobiles. Il a, dans son appel joint, contesté une partie des infractions concernées, soit celles des 20 et 31 mai 2013, 1er juin 2013 et 8 mars 2015. Dans cette mesure, on ne voit pas en quoi le critère du cercle des personnes concernées par la procédure d'appel aurait exclu un appel joint du recourant portant sur les infractions précitées. Peu importe que le recourant et les deux prénommés ne fussent pas, d'un point de vue procédural et comme l'a indiqué la cour cantonale, des "parties adverses". En effet, leurs intérêts étaient contraires, puisque E._ et F._ revendiquaient, dans leur appel, les véhicules A._ châssis no xxx et C._, dont le tribunal de première instance avait ordonné la réalisation en précisant que le solde de celle-ci devait revenir au recourant après déduction de divers frais, des frais judiciaires et de l'amende prononcée. En outre, le recourant pouvait espérer, par son appel joint, éviter toute confiscation des deux véhicules en question et obtenir leur restitution.
L'autorité précédente a ainsi violé le droit fédéral en refusant totalement d'entrer en matière sur l'appel joint formé par le recourant. Le recours droit être admis sur ce point, le jugement attaqué annulé et la cause renvoyée à la cour cantonale afin que celle-ci entre en matière sur l'appel joint en question dans la mesure où celui-ci concerne les infractions impliquant les véhicules A._ châssis no xxx et C._ qui ont été revendiqués par E._ et F._. En cas d'acquittement du recourant concernant l'une ou l'autre de ces infractions, la cour cantonale devra également examiner à nouveau, cas échéant, la question de la confiscation et de la réalisation des véhicules précités.
2.
Le recours doit être admis. Le recourant, qui obtient gain de cause, ne supporte pas de frais judiciaires (<ref-law>). Il peut prétendre à de pleins dépens, à la charge du canton de Neuchâtel (<ref-law>). La demande d'assistance judiciaire est sans objet (<ref-law>).
La cause étant jugée, la requête d'effet suspensif est sans objet.

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est admis, le jugement attaqué est annulé et la cause est renvoyée à la cour cantonale pour nouvelle décision.
2.
Il n'est pas perçu de frais judiciaires.
3.
Le canton de Neuchâtel versera au recourant une indemnité de 3'000 fr. pour ses dépens dans la procédure devant le Tribunal fédéral.
4.
Le présent arrêt est communiqué aux parties et à la Cour pénale du Tribunal cantonal du canton de Neuchâtel.
Lausanne, le 22 février 2019
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
Le Président : Denys
Le Greffier : Graa