有指针的问题

时间:2013-10-23 14:22:07

标签: c arrays pointers

我对编程很新,我遇到指针问题。我的下面的代码适用于例外情况,因为当我对它进行排序时,我的计数不会跟随我的文章编号。我可能需要指点让这个工作,但我不知道如何。

任何人都可以帮助我吗?

void printMenu(void)
{

  printf("\nMENU:\n");
  printf("(D)isplay the menu\n");
  printf("(G)enerate inventory\n");
  printf("(P)rint inventory\n");
  printf("(L)inear search article\n");
  printf("(B)inary search article\n");
  printf("(I)nsertion sort inventory\n");
  printf("B(u)bble sort inventory\n");
  printf("(M)erge sort inventory\n");
  printf("(Q)uit program\n");
}

void generateInventory(article inventory[], int noOfArticles,
    int minArticleNumber, int maxArticleNumber, int maxNoOfArticles)
{
  int i, j;
  int idCount[] =
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };

  for (i = 0; i < noOfArticles; i++)
  {
    inventory[i].id = rand() % (maxArticleNumber - minArticleNumber + 1) +

    minArticleNumber;
    idCount[inventory[i].id - 1] = idCount[inventory[i].id - 1] + 1;

    for (j = 0; j <= i; ++j)
    {
      if (idCount[inventory[i].id - 1] > 1)
      {
        inventory[i].id = rand() % (maxArticleNumber + minArticleNumber);
      }
    }
    inventory[i].counts = rand() % maxNoOfArticles;
  }
}

void printInventory(const article inventory[], int noOfArticles)
{

  int i;

  printf("\nINVENTORY\n");
  printf("%7s %8s\n", "Article", "Count");
  for (i = 0; i < noOfArticles; i++)
  {
    printf("%7d %8d\n", inventory[i].id, inventory[i].counts);
  }
}

int getArticleId()
{

  int id;

  printf("\nGive article id: ");
  scanf("%d", &id);

  return id;
}

void printSearchResult(const article inventory[], int index)
{

  if (index == -1)
  {
    printf("\nArticle not found\n");
  }
  else
  {
    printf("\nArticle id: %d\n", inventory[index].id);
    printf("Article counts: %d\n", inventory[index].counts);
  }
}

int linearSearchInventory(const article inventory[], int noOfArticles, int id)
{
  int i = 0;
  int index = -1;

  while (index == -1 && i < noOfArticles)
  {
    if (id == inventory[i].id)
    {
      index = i;
    }

    i++;
  }
}

int binarySearchInventory(const article inventory[], int noOfArticles, int id)
{

  int index = -1;
  int left = 0;
  int right = noOfArticles - 1;
  int middle;

  while (index == -1 && left <= right)
  {
    middle = (left + right) / 2;
    if (id == inventory[middle].id)
    {
      index = middle;
    }
    else if (id < inventory[middle].id)
    {
      right = middle - 1;
    }
    else
    {
      left = middle + 1;
    }
  }

  return index;
}

void insertionSortInventory(article inventory[], int noOfArticles)
{

  int i, j;
  int next;

  for (i = 1; i < noOfArticles; i++)
  {
    next = inventory[i].id;

    j = i - 1;
    while (j >= 0 && next < inventory[j].id)
    {
      inventory[j + 1].id = inventory[j].id;
      j = j - 1;
    }

    inventory[j + 1].id = next;
  }
}

void bubbleSortInventory(article inventory[], int noOfArticles)
{

  int c, d, t;

  for (c = 0; c < (noOfArticles - 1); c++)
  {

    for (d = 0; d < noOfArticles - c - 1; d++)
    {

      if (inventory[d].id > inventory[d + 1].id)
      {

        t = inventory[d].id;
        inventory[d].id = inventory[d + 1].id;
        inventory[d + 1].id = t;
      }
    }
  }
}

void mergeSortInventory(article inventory[], int noOfArticles)
{

  int temp[noOfArticles / 2];
  int nLeft, nRight;
  int i, iLeft, iRight;

  if (noOfArticles > 1)
  {

    nLeft = noOfArticles / 2;
    nRight = (int) ceil((double) noOfArticles / 2);

    mergeSortInventory(inventory, nLeft);
    mergeSortInventory(&inventory[noOfArticles / 2], nRight);

    for (i = 0; i < nLeft; i++)
    {
      temp[i] = inventory[i].id;
    }

    i = 0;
    iLeft = 0;
    iRight = 0;
    while (iLeft < nLeft && iRight < nRight)
    {
      if (temp[iLeft] < inventory[noOfArticles / 2 + iRight].id)
      {
        inventory[i].id = temp[iLeft];
        iLeft = iLeft + 1;
      }
      else
      {
        inventory[i].id = inventory[noOfArticles / 2 + iRight].id;
        iRight = iRight + 1;
      }
      i = i + 1;
    }

    while (iLeft < nLeft)
    {
      inventory[i].id = temp[iLeft];
      i = i + 1;
      iLeft = iLeft + 1;
    }

  }
}

2 个答案:

答案 0 :(得分:0)

如果我对你的要求是正确的,你想保持idCount数组与库存数组的关系。我假设,因为你正在使用文章作为一种类型,你要么将一个变量键入为一篇文章,这将是毫无意义的,或者更可能是你构建了一个类型文章的结构,然后制作了一个数组那些结构,并称为阵列库存。

如果是这种情况,那么保持关系的最可能方法就是在文章结构中包含计数。

有一些方法可以在不这样做的情况下使数组成为关系,但是它们没有意义,因为一个简单的四行结构就可以解决这个问题,即使该结构是不同结构的包装器,也可能是另一个结构的标头。结构

答案 1 :(得分:0)

对记录进行排序时,只需指定结构的id成员:

inventory[foo].id = inventory[bar].id;

您应该分配完整的结构:

inventory[foo] = inventory[bar];

请记住临时工具必须是article而不是int,所以他们也可以分配一个完整的结构,而不仅仅是一个id值