Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка и поиск элементов в таблице на Си 
:(
    Опции темы
Gwynbleiddd
Дата 8.10.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



Привет.

Есть задачка на Си:
Написать подпрограмму сохранения имён в таблице имён. Использовать для убыстрения поиска хэширование имён, причём хэш код равен остатку от деления суммы символов имени на число 211. Таблицу имён представить в виде массива структур:
struct s{char*name/*имя*/; char *defn/*замещающий текст*/; struct s *next/*указатель на следующий элемент*/;}


Есть вроде как почти готовая эта прога.

Код на Си

Код



#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#define HASHSIZE 211

struct nlist {
    struct nlist *next;
    char *name;
    char *defn;
};

static struct nlist *hashtab[HASHSIZE];

unsigned hash (char *s)
{
unsigned hashval;
for (hashval =0; *s!='\0'; s++)
hashval = *s + 31 * hashval;
return hashval % HASHSIZE;
;
}

struct nlist *lookup(char *s)
{
struct nlist *np;
for (np = hashtab[hash(s)]; np != NULL; np = np -> next)
if (strcmp (s, np ->name) == 0)
return np;
return NULL;
printf ("%s", &name);
}

struct nlist *install (char *name, char *defn)
{
struct nlist *np;
unsigned hashval;
if ((np=(lookup(name))) == NULL)
{
    np = (struct nlist*)malloc(sizeof (*np));
if (np == NULL || (np ->name = strdup(name)) == NULL)
return NULL;
hashval=hash(name);
np ->next=hashtab[hashval];
hashtab[hashval]=np;
}
else free ((void *)np ->defn);
if ((np->defn = strdup(defn)) == NULL)
return NULL;
return np;
}

main ()
{ int i=4;
char s[5];

struct nlist *name;
struct nlist *defn;
struct nlist *p;
struct nlist *q=NULL;
struct nlist *e=NULL;
    do
    {
    
    
     p=(struct nlist*)malloc(sizeof(struct nlist));
     printf ("\nName:\n");
     scanf ("%s", &p->name);
     printf ("\nText:\n");
     scanf ("%s", &p->defn);
     i--;
    
     
     if (q==NULL && e==NULL)
     q=p;
     else e->next=p;
     e=p;
     e->next=NULL;
        }
 while (i);
printf ("\nSoderjimoe");
        p=q;
while (p!=NULL)
{
    printf ("\nname = %c", p->name);
    printf ("\tText = %c", p->defn);
p=p->next;
}
printf ("\n");
free (p);
getc;
}


В ней ввод имён осуществлён через цикл до 4, т.к. не было особого времени делать нормальные условия - прога вообще не работала. 

Функиця install (s,t) записывает имя s  и замещающий его текст t  в таблицу, s и t - стринги. Обращается к lookup, чтобы определить, есть ли в наличии вставляемый стринг. Если есть, то старое определение заменяется новым. Или будет образован новый элемент.

lookup (s) ищет в таблице имя s и возвращает указатель на место, где имя s было найдено, или NULL, есди его не оказалось.

hash (s) считает хэш-код имени.

Не смог сделать,  чтобы на экран выводилось имя и текст, его замещающий, которое мы ищем с помощью lookup.

Помогите пожалуйста доделать эту программу до нормального рабочего состояния smile

PM MAIL   Вверх
AntonX
Дата 11.10.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.2.2006
Где: РФ

Репутация: нет
Всего: -1



Код

struct nlist *lookup(char *s)
{
struct nlist *np;
for (np = hashtab[hash(s)]; np != NULL; np = np -> next)
if (strcmp (s, np ->name) == 0)
return np;
return NULL;
printf ("%s", &name);
}


printf ("%s", &name);   -  либо мусор остался, либо это что-то не работает.



Цитата

printf ("\n");
free (p);
getc;         // здесь задержка. :scanf("");

}


все нормально печатает.

или ты как-то по другому хотел. Объясни.
PM MAIL ICQ   Вверх
Gwynbleiddd
Дата 11.10.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 25.3.2008

Репутация: нет
Всего: нет



Чего хочу:
когда пользователь заканчивает заполнение таблицы он может обратиться к функции поиска имени (lookup). Он вводит искомое имя, а на экран выводится результат - найденное имя и соответствущий ему текст.

Код



struct nlist *lookup(char *s)
{
struct nlist *np;
for (np = hashtab[hash(s)]; np != NULL; np = np -> next)
if (strcmp (s, np ->name) == 0)
return np;
return NULL;
printf ("%s", &(np->name));
}


Попробовал через printf ("%s", &(np->name));, но всё равно ничего не выводит.

Кстати, а как преобразовать char *name в char *name[10]? А то пишешь имя 1234 например, а в таблицу сохраняется 1.
PM MAIL   Вверх
J0ker
Дата 13.10.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(Gwynbleiddd @  11.10.2008,  17:11 Найти цитируемый пост)
Кстати, а как преобразовать char *name в char *name[10]?

OMG опять....  smile 


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1995 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.