질문: [C언어]이 프로그램 내에서 이중 포인터를 사용하는 이유가 뭔가요? nucleus824 / 2005-01-21 22:39
링크드리스트를 작성한 프로그램입니다..

여기서 이해 안되는곳이 insertNode라는 함수에서 첫번째 인자값을

이중 포인터로 선언되어있는데 왜 그런가요??

#include
#include

struct listNode {

char data;
struct listNode *nextPtr;

};

typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;

ListNodePtr createNode(void);
void destroyNode(ListNodePtr);
int insertNode(ListNodePtr *, ListNodePtr);
char deleteNode(ListNodePtr *, char);
int isEmpty(ListNodePtr);
void printList(ListNodePtr);
void instructions(void);

int main()
{
ListNodePtr startPtr = NULL;
ListNodePtr creNodePtr = NULL;
int choice;
char item;

instructions();
printf("?");
scanf("%d", &choice);

while(choice != 3) {
switch(choice) {

case 1:
if( (creNodePtr = createNode() ) == NULL ) break;
if( insertNode( &startPtr, creNodePtr) == -1) {
destroyNode( creNodePtr );
break;
}

printList( startPtr );
break;

case 2:
if( !isEmpty( startPtr ) ) {
printf( "Enter character to be deleted: ");
scanf( "\n%c", &item );
if ( deleteNode( &startPtr, item ) ) {
printf("%c deleted.\n", item );
printList( startPtr );
}
else
printf( "%c not found.\n\n", item );
}
else
printf( "List is empty.\n\n" );
break;
default:
printf( "Invalid choice.\n\n" );
instructions();
break;
}

printf( "? " );
scanf( "%d", &choice );
}

printf( "End of run.\n" );
return 0;
}


ListNodePtr createNode(void) {
ListNodePtr newPtr;

newPtr = (ListNodePtr)malloc( sizeof( ListNode ) );

if( newPtr != NULL ) {
newPtr->nextPtr = NULL;
printf( "Enter a character: " );
scanf( "\n%c", &newPtr->data );
return newPtr;
} else {
printf( "Node is not created. No memory available.\n" );
return NULL;
}
}

void destroyNode( ListNodePtr desPtr ) {
free( desPtr );
}

void instructions( void ) {
printf( "Enter your choice:\n"
" 1 to insert an element into the list.\n"
" 2 to delete an element from the list.\n"
" 3 to end.\n");
}

int insertNode( ListNodePtr *sPtr, ListNodePtr newPtr ) {
ListNodePtr previousPtr, currentPtr;
char keyValue;

previousPtr = NULL;
currentPtr = *sPtr;

keyValue = newPtr->data;

while ( currentPtr!=NULL && keyValue > currentPtr->data ) {
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}

if( currentPtr != NULL && currentPtr->data == keyValue ) {
printf("\n%c is alread existed...\n", keyValue );
return -1;
}

if( previousPtr == NULL ) {
newPtr->nextPtr = *sPtr;
*sPtr = newPtr;
}
else {
previousPtr->nextPtr = newPtr;
newPtr->nextPtr = currentPtr;
}

return 0;
}

char deleteNode( ListNodePtr *sPtr, char keyValue ) {
ListNodePtr previousPtr, currentPtr, tempPtr;

if( keyValue == (*sPtr)->data ) {
tempPtr = *sPtr;
*sPtr = ( *sPtr )->nextPtr;
destroyNode( tempPtr);
return keyValue;
}
else {
previousPtr = *sPtr;
currentPtr = ( *sPtr )->nextPtr;

while( currentPtr != NULL && currentPtr->data != keyValue )
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}

if( currentPtr != NULL ) {
tempPtr = currentPtr;
previousPtr->nextPtr = currentPtr->nextPtr;
destroyNode( tempPtr );
return keyValue;
}
}

return '\0';
}

int isEmpty( ListNodePtr sPtr)
{
return sPtr == NULL;
}

void printList( ListNodePtr currentPtr )
{
if( currentPtr == NULL )
printf( "List is empty.\n\n" );
else {
printf( "The list is:\n" );

while( currentPtr != NULL ) {
printf( "%c -> ", currentPtr->data );
currentPtr = currentPtr->nextPtr;
}

printf( "NULL\n\n" );
}
}
답변: re: [C언어]이 프로그램 내에서 이중 포인터를 사용하는 이유가 뭔가요? iindra81 / 2005-01-21 01:23
포인터는 이해하기가 어렵죠 ㅠ ㅅ ㅠ 제대로 개념을 잡지 못하면 상당히 헤메게 됩니다..;; (나는 과연 제대로 알고있을까..ㅋ) 아무튼 문제에 대한 답변을 하자면요.. 위의 프로그램에서 ListNode x 라고 ...

'c or linux' 카테고리의 다른 글

library  (0) 2005.03.13
[펌] 이중 포인터 사용 용도 질문(내공있음)  (0) 2005.03.12
assert의 응용  (0) 2005.03.09
함수의 인수를 확인하기 위해 assertion을 사용한다  (0) 2005.03.09
원형(prototype) 강화하기  (0) 2005.03.09
Posted by '김용환'
,