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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2008, 16:43   #1
Gwynbleidd
 
Регистрация: 16.12.2007
Сообщений: 8
По умолчанию Заполнение таблицы и поиск имени

Привет.

Есть задачка на Си:
Написать подпрограмму сохранения имён в таблице имён. Использовать для убыстрения поиска хэширование имён, причём хэш код равен остатку от деления суммы символов имени на число 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;
}

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);
scanf ("");
}

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

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

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

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

Не получается сделать следущие :

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

2)Не получается обратиться к функциям hash, lookup и install - вылетает из программы.

3)При вводе имени и текста в конце выводится лишь первые символы всего этого. Например вводим имя 1234, а в таблице выводится только 1.
Как преобзразовать *name в *name[10]?


Помогите пожалуйста доделать эту программу до нормального рабочего состояния
Gwynbleidd вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TTreeView поиск по имени Родион Компоненты Delphi 6 05.05.2008 14:07
Сортировать по имени Манжосов Денис :) Помощь студентам 2 25.04.2008 10:12
Не получается заполнение TreeView из таблицы бд Paul Hindenburg БД в Delphi 3 10.03.2008 18:25
Смена имени Terran Win Api 2 14.12.2007 17:19