끄적끄적
[프로그래밍/C] 링크드리스트를 이용한 stacklist
컴퓨터/C
2017. 1. 6. 21:33
반응형
#include <stdio.h>
#include <stdlib.h>
typedef
int
element;
typedef
struct
stackNode
{
element data;
//해당 노드의 값을 가지고 있는 int형 data변수
struct
stackNode* link;
// 이전 노드의 주소값을 가지고 있게 될 구조체 포인터 변수
}stackNode;
stackNode* top;
// 최상위 값을 가지게 되는 포인터 구조체 변수
stackNode* cur;
// 현재 위치값을 가지게 될 포인터 구조체 변수
stackNode* curprev;
// 현재 위치값의 이전값을 가지게 될 구조체 변수
int
flag = 0;
void
push(element num)
{
stackNode* temp = (stackNode*)malloc(
sizeof
(stackNode));
if
(top == NULL)
// top이 값이 없는 상태에서 값을 넣으면 flag를 1을 가지게 한다.
flag = 1;
temp->data = num;
// temp의 data에 입력값을 저장한다.
temp->link = top;
// 이전 노드를 기억 하기위한 link에 현재 top의 위치를 저장시킨다.
top = temp;
// top 구조체 변수에 새로운 top이 될 임시 구조체 변수 temp를 넣는다.
}
element pop()
{
element n;
stackNode* temp = top;
if
(top == NULL)
// 스택에 값이 없으면
{
printf(
"\nStack is empty\n"
);
return
0;
}
else
{
n = temp->data;
top = temp->link;
if
(top == NULL)
// 스택이 비게되면 flag에 0을 써줘서
flag = 0;
// insert입력시에 잘못된 값을 넣는것을 방지한다.
free(temp);
// 더이상 사용하지 않는 temp변수를 메모리에서 해제시킨다.
printf(
"pop Num : %d\n"
, n);
return
n;
}
}
void
printStack()
{
stackNode* p = top;
// 임시 포인터 구조체변수 p를 선언하여 top의 값을 복사한다.
printf(
"\nstack [ "
);
while
(p)
{
printf(
"%d "
,p->data);
// p의 데이터를 출력한다.
p = p->link;
// p의 데이터를 출력후 p를 p의 link값을 가지게 함으로서 앞으로 한칸 가게 한다.
}
printf(
"]\n"
);
}
void
search(element num)
{
cur = top;
// top을 cur변수(위치정보를 가지게 될 변수)에 복사한다.
curprev = top->link;
while
(cur)
// cur가 NULL을 가지게 될때까지
{
if
(cur->data == num)
// 만약 값을 찾게 된다면 반복문을 종료한다.
{
return
;
}
else
{
cur = cur->link;
// 아니라면 cur의 앞의 노드로 cur를 이동 시킨다.
curprev = curprev->link;
}
}
printf(
"not find num\n"
);
// 값을 찾지 못하면 찾지못하였음을 알리고
return
;
// 종료한다.
}
void
insert(element num)
{
stackNode* newnode = (stackNode*)malloc(
sizeof
(stackNode));
int
val1 = 0;
if
(flag == 0)
// 만약에 값이 하나도 없다면 insert가 될수 없으므로
{
push(num);
// push를 한다.
}
else
{
printf(
"Select input position : "
);
// 삽입할 위치를 알 수 없으므로
scanf(
"%d"
,&val1);
// 삽입할 위치를 입력한다.
search(val1);
// 삽입할 위치의 값이 스택에 있는치 찾는다.
newnode->data = num;
newnode->link = cur->link;
cur->link = newnode;
}
}
void
del(element num)
// 최상위의 값을 지우는 함수
{
if
(top == NULL)
// 만약 스택이 비었으면
{
printf(
"stack is empty\n"
);
// 메시지 출력수
return
;
// 종료한다.
}
else
{
search(num);
top = top->link;
// 아니라면 top을 한칸 앞으로 이동 시킨다.
}
}
element peek(){
// 최상위, 즉 top의 값을 반환하는 함수이다.
element item;
item = top->data;
// item에 top의 data를 저장한다.
return
item;
// item을 반호나한다.
}
element main(
int
argc,
char
** argv)
{
int
num = 0;
int
val = 0;
while
(1)
{
printf(
"select : 1. push, 2.pop, 3.insert, 4. delete, 5. printStack, 0. exit\n"
);
printf(
" -> "
);
scanf(
"%d"
,&num);
if
(num == 1)
{
printf(
"Enter num :"
);
scanf(
"%d"
, &val);
push(val);
}
else
if
(num == 2)
{
pop();
}
else
if
(num == 3)
{
printStack();
printf(
"Enter insert Number : "
);
scanf(
"%d"
, &val);
insert(val);
}
else
if
(num == 4)
{
printStack();
printf(
"Enter delete Number : "
);
scanf(
"%d"
, &val);
del(val);
}
else
if
(num == 5)
{
printStack();
}
else
if
(num == 0)
{
exit(0);
}
else
{
printf(
"That's wrong input"
);
}
}
}
반응형
공유하기
게시글 관리
끄적끄적
'
컴퓨터
>
C
' 카테고리의 다른 글
[프로그래밍/C] C언어 함수 완벽 정리
(0)
2017.01.20
[프로그래밍/C] bit 연산 , 비트 연산
(0)
2017.01.14
[프로그래밍] C Standard Library
(0)
2016.12.04
[프로그래밍/C] 파일 입.출력
(0)
2016.11.30
[프로그래밍/C] 문자열 함수 정리
(0)
2016.11.30
'컴퓨터/C' 의 관련글
[프로그래밍/C] C언어 함수 완벽 정리
2017.01.20
더보기
[프로그래밍/C] bit 연산 , 비트 연산
2017.01.14
더보기
[프로그래밍] C Standard Library
2016.12.04
더보기
[프로그래밍/C] 파일 입.출력
2016.11.30
더보기
댓글
(0)
Please Enable JavaScript!
Mohon Aktifkan Javascript!
[ Enable JavaScript ]
티스토리툴바
끄적끄적
구독하기