Почему значения моих связанных списков из другого связанного списка удаляются, когда я удаляю узел из другого связанного списка? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть связанный список, который представляет колоду карт, и когда я иду, чтобы дать карту игроку и компьютеру (по одному для каждого за раз), я копирую значения с верхней карты, передаю ее значениякарта в руке, но когда я иду, чтобы удалить узел из колоды, его удаление портится со значениями карты в руке.его значения при удалении совпадают со значениями карты в руке.

Кроме того, я включил весь свой код на всякий случай, если он помогает, но еще не все закончено.Просто пытаюсь заставить руки работать, прежде чем я уйду.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<time.h>
#include <stdlib.h>
#include <wchar.h>
#include <conio.h>

int rand_gen(int count) {
double frac;
frac = (double)rand() / ((double)RAND_MAX + 1);
return floor(count * frac);
}
typedef struct card_s {
char suit;
int suitnum;
int face;
struct card_s *next, *previous;
}card;

void deletecard(card *p, card **hl) {
if (p == *hl) {
    *hl = p->next;
}
else {
    p->previous->next = p->next;
}
if (p->next == NULL) {
    p->previous->next = NULL;
}
else {
    p->next->previous = p->previous;
}
free(p);
}
void createdeck(card **hl) {
int i = 1;
int j;
int y = 0;
card* temp;
temp = (card *)malloc(sizeof(card));
card* temp2;
temp2 = (card *)malloc(sizeof(card));
while (i <= 13) {
    j = 1;
    while (j <= 4) {
        temp2->face = i;
        temp2->suitnum = j;
        if (*hl == NULL) {
            temp->next = NULL;
            temp->previous = NULL;
            temp->face = 1;
            temp->suitnum = 1;
            (*hl) = temp;
        }
        else {
            temp->next = temp2;
            temp2->previous = temp;
            temp2->next = NULL;
            temp = temp->next;
            temp2 = (card *)malloc(sizeof(card));
        }
        j++;
    }
    i++;
}
}
void printdeck(card *currentNode) {
printf("\n\n\n");
if (currentNode->suitnum == 1) {
    currentNode->suit = '♣';
}
else if (currentNode->suitnum == 2) {
    currentNode->suit = '♦';
}
else if (currentNode->suitnum == 3) {
    currentNode->suit = '♥';
}
else {
    currentNode->suit = '♠';
}
while (currentNode != NULL) {
    printf("Face: %d, Suit: %c\n", currentNode->face, currentNode- 
>suit);
    currentNode = currentNode->next;
}
}

void shuffle(card *current) {
int x = 1;
while (x < 1000) {
    int i = 0;
    int c = 0;
    int y = 0;
    card* temp;
    card *temp2;
    card* temp3;
    temp3 = (card *)malloc(sizeof(card));
    temp2 = (card *)malloc(sizeof(card));
    temp = (card *)malloc(sizeof(card));
    while (i < 52) {
        int c = 0;
        int j = rand_gen(51);
        temp = current;
        while (c < j) {
            temp = temp->next;
            c++;
        }
        int y = 0;
        temp2 = current;
        while (y < i) {
            temp2 = temp2->next;
            y++;
        }
        temp3->face = temp2->face;
        temp3->suitnum = temp2->suitnum;
        temp2->face = temp->face;
        temp2->suitnum = temp->suitnum;
        temp->face = temp3->face;
        temp->suitnum = temp3->suitnum;
        i++;
    }
    x++;
}
}

void drawhand(card **player, card **computer, card **headl) {
//not done yet, need to fix the cards' values from going deleted
int i = 0;
card* temp = (card *)malloc(sizeof(card));
temp = *headl;
*player = temp;
card* temp2 = (card *)malloc(sizeof(card));
temp2 = temp->next;
deletecard(temp, headl);
*computer = temp2;
card* temp3 = (card *)malloc(sizeof(card));
temp3 = temp2->next;
deletecard(temp2, headl);
(*player)->next = temp3;
card* temp4 = (card *)malloc(sizeof(card));
temp4 = temp3->next;
deletecard(temp3, headl);
(*computer)->next = temp4;
card* temp5 = (card *)malloc(sizeof(card));
temp5 = temp4->next;
deletecard(temp4, headl);
(*player)->next->next = temp5;
card* temp6 = (card *)malloc(sizeof(card));
temp6 = temp5->next;
deletecard(temp5, headl);
(*computer)->next->next = temp6;
card* temp7 = (card *)malloc(sizeof(card));
temp7 = temp6->next;
deletecard(temp6, headl);
(*player)->next->next->next = temp7;
card* temp8 = (card *)malloc(sizeof(card));
temp8 = temp7->next;
deletecard(temp7, headl);
(*computer)->next->next->next = temp8;
card* temp9 = (card *)malloc(sizeof(card));
temp9 = temp8->next;
deletecard(temp8, headl);
(*player)->next->next->next->next = temp9;
card* temp10 = (card *)malloc(sizeof(card));
temp10 = temp9->next;
deletecard(temp9, headl);
deletecard(temp10, headl);
(*player)->next->previous = *player;
(*player)->next->next->previous = (*player)->next;
(*player)->next->next->next->previous = (*player)->next->next;
(*player)->next->next->next->next->previous = (*player)->next->next- 
>next;
(*player)->next->next->next->next->next = NULL;
(*computer)->next->previous = *computer;
(*computer)->next->next->previous = (*computer)->next;
(*computer)->next->next->next->previous = (*computer)->next->next;
(*computer)->next->next->next->next->previous = (*computer)->next- 
>next->next;
(*computer)->next->next->next->next->next = NULL;
}
void valueprint(int x) {
printf("Royal Flush          10♠ J♠ Q♠ K♠ A♠\n\n");
printf("Straight Flush       2♣ 3♣ 4♣ 5♣ 6♣\n\n"); 
printf("Four of a Kind       9♣ 9♠ 9♥ 9♦ ■\n\n");
printf("Full House           9♣ 9♠ 9♥ 3♥ 3♠\n\n");
printf("Flush                ■♥ ■♥ ■♥ ■♥ ■♥\n\n");
printf("Straight             4■ 5■ 6■ 7■ 8■\n\n");
printf("Three of a Kind      9♣ 9♠ 9♥ ■ ■\n\n");
printf("Two Pair             K♠ K♣ 6♠ 6♥ ■\n\n");
printf("Jacks or Better      J♣ J♠ ■ ■ ■\n\n");
}
void computerhand(card *currentnode, int i) {
printf("\n\n\n");
//not done yet, need to print the computer's three cards and 2 blank 
spaces
}
void bank(int balance) {
printf("Your balance is: %d coins.\n", balance);
}
int bet(int *balance) {
int bet;
printf("Place your bet (1-%d) coins: \n", balance);
scanf("%d", &bet);
while (bet > balance || bet < 0) {
    printf("Place your bet (1-%d) coins: \n", balance);
    scanf("%d", &bet);
}
balance = balance - bet;
printf("You bet %d coins.  Now you have %d coins.\n", bet, balance);
return bet;
}
void swap(card **player) {
int i = 0;
int array[5];
int value;
int y = 0;
while (y != -1) {
    printf("Pick cards (between 1-5) to swap (-1 to stop):");
    scanf("%d", &value);
    if (value == -1) {
        y = -1;
    }
    else if (value <= 5 || value >= 0){
        array[i] = value;
        i++;
    }
}
i = 0;
/*while(array[i]!=NULL){
card* temp = (card *)malloc(sizeof(card));
i++;*/
//not done yet, still need to swap cards
}
void computerswap(card **computer) { 
//not done yet, need to do it all
}
int winner(card *player, card *computer) {
//not done yet, need to do it all
}

int main(void) {
char answer = 'y';
while (answer == 'y' || answer == 'Y') {
    int x = 1;
    valueprint(x);
    int *balance=100;
    while (balance > 0) {
        srand((int)time(NULL));
        card *headl = NULL;
        createdeck(&headl);
        printdeck(headl);
        shuffle(headl);
        int betvalue;
        printdeck(headl);
        card* player = NULL;
        card* computer = NULL;
        drawhand(&player, &computer, &headl);
        printf("Computer/Dealer's hand:\n");
        computerhand(computer, 1);
        printf("Your hand:\n");
        printdeck(player);
bank(balance);
        betvalue = bet(balance);
        swap(player);
        computerswap(computer);
        printf("Your hand: \n");
        printdeck(player);
        printf("Computer/Dealer's hand:\n");
        computerhand(computer, 2);
        if (winner(player, computer) == 1) { //player
            balance = balance + betvalue;
            printf("You won!!! Your balance is now %d", 
balance);
        }
        else if (winner(player, computer) == 2) { //computer
            balance = balance - betvalue;
            printf("you lost.  Your balance is now %d", 
balance);
        }
        printf("Hit Enter key to continue: ");
        _getch();
}
}
}
...