home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Mother of All Windows Books
/
CD-MOM.iso
/
cd_mom
/
newsletr
/
winprogj
/
wpjv1n1
/
linklist.c
next >
Wrap
Text File
|
1993-01-01
|
6KB
|
217 lines
/* LINKLIST.C
by Mike Wallace
Windows Programmer's Journal
Volume 1 Number 1
Copyright 1992
*/
/* linked list windows application */
#include <windows.h>
#include <stdio.h>
#include "linklist.h"
int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS wndclass;
ghInstance = hInstance;
if(!hPrevInstance)
{
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (hInstance, ProgName);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = ProgName;
wndclass.lpszClassName = ProgName;
if (!RegisterClass (&wndclass)) return FALSE;
}
hWnd = CreateWindow (
ProgName,
ProgName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow (hWnd, nCmdShow);
UpdateWindow (hWnd);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
} /* WinMain */
long FAR PASCAL WndProc (HWND hWnd, unsigned Msg, WORD wParam, LONG lParam)
{
switch (Msg)
{
case WM_COMMAND:
switch (wParam)
{
case IDM_RUN:
MakeList (hWnd);
MessageBox (hWnd, "Done", "Hey", MB_OK);
break;
case IDM_QUIT:
DestroyWindow (hWnd);
break;
}
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hWnd, Msg, wParam, lParam);
}
return (0L);
} /* WndProc */
/****************************************/
/* */
/* */
/****************************************/
void FAR PASCAL MakeList (HWND hWnd)
{
/* local variables */
short i;
static HANDLE hMem, hMem2, hMem3;
/* structure of each node in linked list */
typedef struct _listmarker {
short value;
HANDLE next;
} ListMarker;
/* declare a far pointer to the above structure */
typedef ListMarker FAR *LISTMARKER;
LISTMARKER tailPos, tempPos, headPos;
/* pointer to output file */
FILE *fp;
/* Open output file for writing */
fp= fopen("data.out", "w");
/* Build initial linked list of the numbers 1 to 10 */
if((hMem= GlobalAlloc(GMEM_DISCARDABLE | GMEM_MOVEABLE,
sizeof(ListMarker))) == NULL) {
/* Not enough memory, so beep, show a message and return */
MessageBeep(0);
MessageBox(hWnd, "Out of allocation memory!", "ERROR", MB_OK);
return;
}
/* Lock the first node, save a value, set next to NULL and unlock */
tailPos= headPos= (LISTMARKER) GlobalLock(hMem);
headPos->value= 1;
headPos->next= NULL;
GlobalUnlock(hMem);
for (i=2; i < 11; i++) {
/* setup index lookup lists */
if((tailPos->next= GlobalAlloc(GMEM_DISCARDABLE | GMEM_MOVEABLE,
sizeof(ListMarker))) == NULL) {
MessageBeep(0);
MessageBox(hWnd, "Out of allocation memory!", "ERROR",
MB_OK);
return;
} /* If - End */
/* Lock the next node, save the value, and set its next to NULL */
hMem2= tailPos->next;
tempPos= (LISTMARKER) GlobalLock(hMem2);
tailPos= tempPos;
tailPos->value= i;
tailPos->next= NULL;
GlobalUnlock(hMem2);
} /* While - End */
/* Lock the 1st node and write out its "value" field */
tailPos= headPos= (LISTMARKER) GlobalLock(hMem);
fprintf(fp, "%d\n", tailPos->value);
/* Save the handle to the next node */
hMem2= tailPos->next;
/* Unlock the 1st node */
GlobalUnlock(hMem);
/* Go through list and print out "value" until no more nodes */
while (hMem2 != NULL) {
/* Lock the next node and save to tailPos */
tempPos= (LISTMARKER) GlobalLock(hMem2);
tailPos= tempPos;
fprintf(fp, "%d\n", tailPos->value);
/* Get the handle to the next node and then unlock the current one */
hMem2= tailPos->next;
GlobalUnlock(hMem2);
} /* While - End */
/* Close the output file */
fclose(fp);
/* free nodes in the list */
tempPos= (LISTMARKER) GlobalLock(hMem);
hMem2= tempPos->next;
tempPos= (LISTMARKER) GlobalLock(tempPos->next);
GlobalUnlock(hMem);
GlobalFree(hMem);
while(tempPos->next != NULL) {
hMem3= tempPos->next;
tempPos= (LISTMARKER) GlobalLock(tempPos->next);
GlobalUnlock(hMem2);
GlobalFree(hMem2);
hMem2=hMem3;
}
GlobalUnlock(hMem2);
GlobalFree(hMem2);
return;
} /* MakeList */