struct nlist *np;
for (np = hashtab[hash(s)]; np != NULL; np = np-›next)
if (strcmp(s, np-›name) == 0)
return np; /* нашли */
return NULL; /* не нашли */
}
В
for (ptr = head; ptr != NULL; ptr = ptr-›next)…
Функция
struct nlist *lookup(char *);
char *strdup(char *);
/* install: заносит имя и текст (name, defn) в таблицу */
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); /* освобождаем прежний defn */
if ((np-›defn = strdup(defn)) == NULL)
return NULL;
return np;
}
Упражнение 6.5. Напишите функцию
Упражнение 6.6. Реализуйте простую версию
6.7 Средство typedef
Язык Си предоставляет средство, называемое typedef, которое позволяет давать типам данных новые имена. Например, объявление
typedef int Length;
делает имя
Length len, maxlen;
Length *lengths[];
Аналогично объявление
typedef char *String;
делает
String р, lineptr[MAXLINES], alloc(int);
int strcmp(String, String);
p = (String) malloc(100);
Заметим, что объявляемый в typedef тип стоит на месте имени переменной в обычном объявлении, а не сразу за словом typedef. С точки зрения синтаксиса слово
Для демонстрации более сложных примеров применения
typedef struct tnode *Treeptr;
typedef struct tnode {/* узел дерева: */
char *word; /* указатель на текст */
int count; /* число вхождений */
Treeptr left; /* левый сын */
Treeptr right; /* правый сын */
} Treenode;
В результате создаются два новых названия типов:
Treeptr talloc(void) {
return (Treeptr) malloc(sizeof(Treenode));
}
Следует подчеркнуть, что объявление
typedef int (*PFI)(char *, char *);