пишу списки на visual studio 2008
от части работает!но надо доделать этот список чтобы можно было удалять,добавлять,перемещать элементы во время выполнения программы...подскажите как это сделать!
в заголовочном файле list.h вот так:
Код:
#define LIST struct list
LIST
{
char aLastName[16];
char aFirstName[16];
char aTelephoneNumber[16];
LIST *pNext;
};
extern void insert(LIST **ppList,LIST *pItem);//внешняя функция,невозвращает результат,доступна всем модулям;
extern void destroy(LIST **pList);//уничтожить список;
extern void display(LIST *pList);//вывод списка на экран;
extern int remove(LIST **ppList,LIST *pItem);//удалить элемент;
в списки.срр вот так:
Код:
// списки.cpp: определяет точку входа для консольного приложения.
//List_s.cpp:определяет точку входа для консольного приложения.
//основная программа.
#include "stdafx.h"
#include"list.h"
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#include <conio.h>
//Статическая функция создания элемента списка
static LIST* create(LIST *pItem)
{
LIST *pNewItem=(LIST*)malloc(sizeof(LIST));
*pNewItem=*pItem;
return pNewItem;
}
void insert(LIST **ppList,LIST *pItem)
{
char aKey[16];
LIST *pNewItem;
LIST *pCurItem=*ppList;
LIST *pPreItem=0;
//В качестве ключевого поля в списке используется фамилия.
strcpy_s(aKey,pItem->aLastName);
//Ищем элемент совпадающий с ключевым
while(pCurItem!=0 && strcmp(pCurItem->aLastName,aKey)<0)
{
pPreItem=pCurItem;
pCurItem=pCurItem->pNext;
}
//Здесь pCurItem либо 0, либо равен указателю на найденный элемент.
//Создаём новый элемент и заполняем его поля.
pNewItem=create(pItem);
pNewItem->pNext=pCurItem;
//Вставляем новый элемент в список
if(pPreItem==0)
//либо в начало,
*ppList=pNewItem;
else
//либо после ключевого.
pPreItem->pNext=pNewItem;
}
int remove(LIST **ppList,LIST *pItem)
{
LIST *pCurItem=*ppList;
LIST *pPreItem=0;
//Ищем заданный элемент.
while(pCurItem!=0 && strcmp(pCurItem->aLastName,pItem->aLastName)==0)
{
pPreItem=pCurItem;
pCurItem=pCurItem->pNext;
}
//Если такого элемента нет, то и удалять нечего.
if(pCurItem==0)
return 0;
if(pPreItem==0)
//Удалаяем первый элемент списка.
*ppList=pCurItem->pNext;
else
//Удаляем элемент списка, начиная со второго.
pPreItem->pNext=pCurItem->pNext;
free(pCurItem); //Обязательно освобождаем память.
return 1;
}
void destroy(LIST **ppList)
{
LIST *pCurItem=*ppList;
LIST *pPreItem=0;
//Проходим весь список
while(pCurItem!=0)
{
pPreItem=pCurItem;
pCurItem=pCurItem->pNext;
//и удаляем каждый текущий элемент
free(pPreItem);
}
//Нулевой указатель на начало списка говорит, что список пустой.
*ppList=0;
}
void display(LIST *pList)
{
LIST *pCurItem=pList;
//Последовательно проходим весь список
while(pCurItem)
{
//и выводим информацию о каждом элементе
printf("\n%s,%s", pCurItem->aLastName, pCurItem->aFirstName);
printf("\t%s", pCurItem->aTelephoneNumber);
pCurItem=pCurItem->pNext;
}
printf("\n\n");
}
LIST *pMyList;
int _tmain(int argc, _TCHAR* argv[])
{
LIST *pItem=(LIST*)malloc(sizeof(LIST));
//подготавливаем данные;
strcpy(pItem->aLastName,"Unitazov");
strcpy(pItem->aFirstName,"Sortir");
strcpy(pItem->aTelephoneNumber,"00-00-00");
insert(&pMyList,pItem);//вставляем данные;
//подготавливаем данные;
strcpy(pItem->aLastName,"Sidorov");
strcpy(pItem->aFirstName,"Sidor");
strcpy(pItem->aTelephoneNumber,"01-01-01");
insert(&pMyList,pItem);//вставляем данные;
//подготавливаем данные;
strcpy(pItem->aLastName,"Petrov");
strcpy(pItem->aFirstName,"Petr");
strcpy(pItem->aTelephoneNumber,"02-02-02");
insert(&pMyList,pItem);//вставляем данные;
//подготавливаем данные;
strcpy(pItem->aLastName,"Ivanov");
strcpy(pItem->aFirstName,"Ivan");
strcpy(pItem->aTelephoneNumber,"03-03-03");
insert(&pMyList,pItem);//вставляем данные;
//распечатываем содержимое списка;
display(pMyList);
//удаляем элемент;
remove(&pMyList,pItem);
remove(&pMyList,pItem);
//распечатываем содержимое списка;
display(pMyList);
//разрушаем весь список;
destroy(&pMyList);
_getch();
}
как я пойму всё то что мне надо уже обьявлено...но вот проблема,как сделать чтобы это выполнялось...подскажите пожалуйста...а то я еще плохо в програмировании понимаю!!=(((