Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2011, 19:50   #1
novak3
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 33
По умолчанию указатели

Вот код на С++ программы Алфавитно-частотного словаря. Проверено норм. работает на С++.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct Node {
int count;
char word[40];
Node *next;
};
typedef Node*PNode;
PNode Head=NULL;
 
PNode CreateNode(char NewWord[])
{PNode NewNode=new Node;
strcpy(NewNode->word,NewWord);
NewNode->count=1;
NewNode->next=NULL;
return NewNode;}
 
void AddFirst(PNode &Head,PNode NewNode)
{NewNode->next=Head;
Head=NewNode;}
 
void AddAfter(PNode p,PNode NewNode)
{NewNode->next=p->next;
p->next=NewNode;}
 
void AddBefore(PNode &Head,PNode p, PNode NewNode)
{PNode q=Head;
if (Head==p)
{AddFirst(Head, NewNode);
return;}
while (q && q->next!=p)
q=q->next;
if (q)
AddAfter(q,NewNode);}
 
void AddLast(PNode &Head,PNode NewNode)
{PNode q=Head;
if (Head==NULL)
{AddFirst(Head,NewNode);
return;}
while (q->next)
q=q->next;
AddAfter(q,NewNode);}
 
PNode Find(PNode Head,char NewWord[])
{PNode q=Head;
while (q && strcmp(q->word,NewWord))
q=q->next;
return q;}
 
PNode FindPlace(PNode Head,char NewWord[])
{PNode q=Head;
while(q &&(strcmp(q->word,NewWord)>0))
q=q->next;
return q;}
 
int main()
{
 PNode Head = NULL, p, where;
 FILE *in,*out;
 char word[80];
 int n;
 in=fopen("input.txt","r");
 
 while (1)
 {
n=fscanf(in,"%s",word);
if (n<=0)
break;
p= Find(Head,word);
if (p!=NULL)
p->count++;
else{
p=CreateNode(word);
where=FindPlace(Head,word);
if (!where)
AddLast(Head,p);
else AddBefore(Head,where,p);
}}
fclose(in);
 
out=fopen("output.txt","w");
p=Head;
while(p)
{
fprintf(out,"%-20s\t%d\n",p->word,p->count);
p=p->next;
}
fclose(out);
}
Но ее нужно было переделать на язык Си. Исправил несколько строк (выделены жирн.), но теперь прога не выполняет нужных функций.
Код на Си:
Код:
#include <stdio.h>
#include <string.h>
 
struct Node {
int count;
char word[40];
struct Node*next;
};
typedef struct Node*PNode;
PNode Head=NULL;
 
PNode CreateNode(char NewWord[])
{PNode NewNode=malloc(sizeof(struct Node));
strcpy(NewNode->word,NewWord);
NewNode->count=1;
NewNode->next=NULL;
return NewNode;}
 
void AddFirst(PNode Head,PNode NewNode)
{NewNode->next=Head;
Head=NewNode;}
 
void AddAfter(PNode p,PNode NewNode)
{NewNode->next=p->next;
p->next=NewNode;}
 
void AddBefore(PNode Head,PNode p, PNode NewNode)
{PNode q=Head;
if (Head==p)
{AddFirst(Head, NewNode);
return;}
while (q && q->next!=p)
q=q->next;
if (q)
AddAfter(q,NewNode);}
 
void AddLast(PNode Head,PNode NewNode)
{PNode q=Head;
if (Head==NULL)
{AddFirst(Head,NewNode);
return;}
while (q->next)
q=q->next;
AddAfter(q,NewNode);}
 
PNode Find(PNode Head,char NewWord[])
{PNode q=Head;
while (q && strcmp(q->word,NewWord))
q=q->next;
return q;}
 
PNode FindPlace(PNode Head,char NewWord[])
{PNode q=Head;
while(q &&(strcmp(q->word,NewWord)>0))
q=q->next;
return q;}
 
int main()
{
 PNode Head = NULL, p, where;
 FILE *in,*out;
 char word[80];
 int n;
 in=fopen("input.txt","r");
 
 while (1)
 {
n=fscanf(in,"%s",word);
if (n<=0)
break;
p= Find(Head,word);
if (p!=NULL)
p->count++;
else{
p=CreateNode(word);
where=FindPlace(Head,word);
if (!where)
AddLast(Head,p);
else AddBefore(Head,where,p);
}}
fclose(in);
 
out=fopen("output.txt","w");
p=Head;
while(p)
{
fprintf(out,"%-20s\t%d\n",p->word,p->count);
p=p->next;
}
fclose(out);
}
Проблема здесь, скорее всего, в отсутствии ссылок "&". Наверно нужно воспользоваться указателями, но как это сделать. Пожалуйста, подскажите.
novak3 вне форума Ответить с цитированием
Старый 27.05.2011, 10:30   #2
rustx88
Пользователь
 
Регистрация: 08.05.2011
Сообщений: 42
По умолчанию

конечно! в С нет такого понятия "ссылка", пользуйтесь указателями!

Цитата:
void AddLast(PNode &Head, PNode NewNode)
void AddLast(PNode * Head, PNode NewNode)
rustx88 вне форума Ответить с цитированием
Старый 27.05.2011, 11:05   #3
novak3
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 33
По умолчанию

Если вместо
Код:
void AddLast(PNode &Head, PNode NewNode)
записать
Код:
void AddLast(PNode * Head, PNode NewNode)
то компилятор выдает предупреждение. В том то и дело, что нужно воспользоваться указателем, но как-то иначе, а то компилятор ругается.
novak3 вне форума Ответить с цитированием
Старый 27.05.2011, 14:33   #4
-LeV-
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 29
По умолчанию

Код:
void AddLast(PNode *Head,PNode NewNode)
{PNode q= *Head;
if (*Head==NULL)
{AddFirst(*Head,NewNode);
return;}
while (q->next)
q=q->next;
AddAfter(q,NewNode);}
все то же самое, только разыменовываешь указатель
-LeV- вне форума Ответить с цитированием
Старый 27.05.2011, 15:05   #5
novak3
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 33
По умолчанию

Сделал, но теперь выдает следующие предупреждения

-2\2\main.c||In function `main':|
-2\2\main.c|80|warning: passing arg 1 of `AddLast' from incompatible pointer type|
-2\2\main.c|81|warning: passing arg 1 of `AddBefore' from incompatible pointer type|
||=== Build finished: 0 errors, 2 warnings ===|

И прога по прежднему не выдает результат...
novak3 вне форума Ответить с цитированием
Старый 27.05.2011, 17:51   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Так надо еще везде этим функциям передавать не объекты, а их адреса.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 27.05.2011, 20:47   #7
-LeV-
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 29
По умолчанию

Вызывать так:
Код:
AddLast(&Head,p);
-LeV- вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели @Manya@ Общие вопросы C/C++ 4 17.05.2010 13:53
Указатели GrihaI Общие вопросы C/C++ 11 06.05.2010 18:53
Указатели AquaticSoul Общие вопросы C/C++ 5 22.12.2009 15:13
Указатели Paul_AG Общие вопросы C/C++ 5 03.07.2009 14:22
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39