为struct变量赋值

时间:2014-04-17 00:56:40

标签: c struct

我正在构建一个邻接列表,用于制作有向图。我读了两个字符,然后从每个字符中取出一个顶点,除非已经制作了带有该字符的顶点。我对结构不熟悉,所以这让我感到沮丧。这些值没有被分配,我最终得到一个空列表。我假设它与我忽略的指针有关,但我似乎无法找到问题。我希望有人可以提供帮助。我将包含我的代码和示例输出。

my.h

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

/* Forward declaration */
struct EDGETAG;

typedef struct
{
    char c;
    bool isVisited;
    struct EDGETAG* p;
} VERTEX;

typedef struct EDGETAG
{
    VERTEX* v;
    struct EDGETAG* q;
} EDGE;


int main (int argc, char* argv[]);

int adjListSearch (char a, int size, VERTEX* adjList);

adjListSearch.c

#include "my.h"

int adjListSearch (char a, int size, VERTEX* adjList)
{

int i;


if(size == 0)
{
printf("empty\n");
return 1;
}

for(i = 0; i<size; i++)
{
    if( adjList[i].c = a)
    {
    return 0;
    printf("found\n");
    }
}
printf("notfound\n");
return 1;

}

的main.c

#include "my.h"

int main (int argc, char* argv[])
{




int y = 0;
int x = 0;
VERTEX *adjList;
adjList  = (VERTEX*)calloc(26, sizeof(VERTEX));
//adjList = malloc(sizeof(VERTEX)*26);
FILE* p;
char *fp;
char a;
char b;
int check1 = 0;
int check2 = 0;
int size = 0;
int searchsuccess = 0;
int i;
//Statements



p = fopen( argv[1], "r");



while(fscanf(p," %c %c", &a, &b)!= EOF)  
{
printf("a: %c b: %c\n",a,b);

    check1 = adjListSearch(a,size,adjList);

    if(check1==1)
    {

        adjList[size].c = a;
        size = size +1;

    }   
        //printf("%c\n", adjList[size].c);  

    check2 = adjListSearch(b,size,adjList);
    if(check2==1)
    {
        adjList[size].c = b;
        size = size +1;
    }

}
//End While
printf("Size: %d", size);
for(i=0;i<size;i++)
{
printf("%c\n", adjList[size].c);
}


free(p);


return 0;
}
//End main

示例输出

a: A b: B
a: B b: C
a: E b: X
a: C b: D
Size: 1

正如您所看到的那样,没有任何字符被打印为在结构中。

编辑1:

I would want the expected output to look like 
a: A b: B
a: B b: C
a: E b: X
a: C b: D
Size: 6
A
B
C
E
X
D

编辑2 如果有人可以提供帮助,仍然会失去这一点。

2 个答案:

答案 0 :(得分:2)

存在各种各样的问题。

  1. 您应该使用fclose(p);而不是free(p);
  2. 您应该打印printf("%c\n", adjList[i].c);而不是printf("%c\n", adjList[size].c);
  3. brokenfoot中指出answer,您需要比较a而不是adjListSearch()中的main()
  4. 有多个未使用的变量(我使用的编译选项会抱怨它们)。
  5. 无需声明argv[1](虽然它不会对程序造成任何伤害)。
  6. 您不会检查是否有while (fscanf(p, " %c %c", &a, &b) == 2)可供使用。
  7. 您不会检查是否已打开该文件。
  8. 你应该真的使用fscanf(),尽管只有在处理奇数个字符的情况下,这个程序才有意义。至少你在测试#include "my.h" int main(int argc, char *argv[]) { VERTEX *adjList; adjList = (VERTEX *)calloc(26, sizeof(VERTEX)); FILE *p; char a; char b; int check1 = 0; int check2 = 0; int size = 0; int i; if (argc != 2) { fprintf(stderr, "Usage: %s file\n", argv[0]); return 1; } if ((p = fopen(argv[1], "r")) == 0) { fprintf(stderr, "Failed to open file %s for reading\n", argv[1]); return 1; } while (fscanf(p, " %c %c", &a, &b) == 2) { printf("a: %c b: %c\n", a, b); check1 = adjListSearch(a, size, adjList); if (check1 == 1) { printf("Adding a = %c\n", a); adjList[size++].c = a; } check2 = adjListSearch(b, size, adjList); if (check2 == 1) { printf("Adding b = %c\n", b); adjList[size++].c = b; } } printf("Size: %d\n", size); for (i = 0; i < size; i++) { printf("%c\n", adjList[i].c); } fclose(p); return 0; } ,这比我们看到的许多问题都要多。
  9. 在下面的代码中,我打印了更多信息性的状态消息。

    的main.c

    #include "my.h"
    
    int adjListSearch(char a, int size, VERTEX *adjList)
    {
        int i;
    
        if (size == 0)
        {
            printf("empty\n");
            return 1;
        }
    
        for (i = 0; i < size; i++)
        {
            if (adjList[i].c == a)
            {
                printf("found %c\n", a);
                return 0;
            }
        }
        printf("not found %c\n", a);
        return 1;
    }
    

    adjListSearch.c

    A B
    B C
    E X
    C D
    

    数据

    a: A b: B
    empty
    Adding a = A
    not found B
    Adding b = B
    a: B b: C
    found B
    not found C
    Adding b = C
    a: E b: X
    not found E
    Adding a = E
    not found X
    Adding b = X
    a: C b: D
    found C
    not found D
    Adding b = D
    Size: 6
    A
    B
    C
    E
    X
    D
    

    示例输出

    {{1}}

答案 1 :(得分:1)

adjListSearch()中,更改

if( adjList[i].c = a)

if( adjList[i].c == a)