#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//노드 구조체로 정의
typedef struct ListNode
{
char data[10];
//다음 노드를 이어줄 포인터
struct ListNode* link;
}listNode;
//리스트의 시작을 나타내는 주소 = head
typedef struct
{
listNode* head;
}linkedList_h;
linkedList_h* createListedList_h(void);
void freeLinkedList_h(linkedList_h*);
void addLastNode(linkedList_h*, char*);
void reverse(linkedList_h*);
void deleteLastNode(linkedList_h*);
void printList(linkedList_h*);
//링크 리스트 생성 함수
linkedList_h* createListedList_h(void)
{
linkedList_h* L;
//동적할당으로 새로운 링크 리스트 생성
L = (linkedList_h*)malloc(sizeof(linkedList_h));
//다음 주소를 따라감
L->head = NULL;
return L;
}
//링크 리스트 포함에 요소 포함
void addLastNode(linkedList_h* L, char* x)
{
listNode* newNode;
listNode* p;
//추가할 요소 동적할당
newNode = (listNode*)malloc(sizeof(listNode));
//strcpy로 요소 복사해서 data에 입력
strcpy(newNode->data, x);
newNode->link=NULL;
//NULL값에 도달하면 리턴
if(L -> head == NULL)
{
L->head = newNode;
return;
}
p=L->head;
while (p->link != NULL) p = p->link;
p ->link = newNode;
}
//역순으로 변환
void reverse(linkedList_h* L)
{
listNode* p;
listNode* q;
listNode* r;
p = L -> head;
q= NULL;
r= NULL;
//p=NULL일때까지 변환
while (p != NULL)
{
r = q;
q = p;
p = p -> link;
q -> link = r;
}
L->head = q;
}
//노드 삭제
void deleteLastNode(linkedList_h* L)
{
listNode* previous;
listNode* current;
if(L->head == NULL) return;
if(L->head -> link == NULL)
{
free(L->head);
L->head = NULL;
return;
}
else{
previous = L->head;
current = L ->head -> link;
while(current -> link != NULL)
{
previous = current;
current = current -> link;
}
free(current);
previous->link = NULL;
}
}
//공간해제로 공백만들기
void freeLinkedList_h(linkedList_h* L)
{
listNode* p;
while(L->head != NULL)
{
p = L ->head;
L->head = L ->head ->link;
free(p);
p=NULL;
}
}
//노드요소 출력
void printList(linkedList_h* L)
{
listNode* p;
printf("L = (");
p= L->head;
while(p != NULL)
{
printf("%s", p->data);
p = p->link;
if(p != NULL) printf(", ");
}
printf(") \n");
}
int main()
{
linkedList_h* L;
L = createListedList_h();
printf("(1) 공백 리스트 생성하기! \n");
printList(L); getchar();
printf("(2) 리스트에 3개의 노드 추가하기! \n");
addLastNode(L, "월");
addLastNode(L, "수");
addLastNode(L, "금");
printList(L); getchar();
printf("(3) 리스트 마지막에 노드 한개 추가하기! \n");
addLastNode(L, "일");
printList(L); getchar();
printf("(4) 마지막 노드 삭제하기! \n");
deleteLastNode(L);
printList(L); getchar();
printf("(5) 리스트 원소를 역순으로 변환하기! \n");
reverse(L);
printList(L); getchar();
printf("(6) 리스트 공간을 해제하여, 공백리스트 상태로 만들기! \n");
freeLinkedList_h(L);
printList(L);
getchar();
return 0;
}
'프로그래밍' 카테고리의 다른 글
대학 성적 처리 프로그램 (0) | 2013.05.30 |
---|---|
warning C4996 (0) | 2013.05.21 |
파일 영상처리.cpp (0) | 2013.05.21 |
자유 공간 리스트 알고리즘 (단순 연결 리스트) (1) | 2013.05.20 |
3차원 배열 원소의 논리적,물리적 순서를 확인하는 예제 (0) | 2013.05.19 |