실습(1)
0. 메모리 위치와 사이즈 구하기 :
#include<stdio.h>
#include<iostream.h>
void main()
{
char character_N = 'a';
int intager_N = 1;
double double_N = 1;
//주소출력-> ex)출력 : 0x1122ff (16진수형)
cout<<"Address of primitive type\n"<<endl;
printf("Character : 0x%x\n", &character_N); //0x12ff7c
printf("Integer : 0x%x\n", &intager_N); //0x12ff78
printf("Double : 0x%x\n", &double_N); //0x12ff70
cout<<endl<<endl;
//크기출력-> ex)출력 : 1e8byte(s)
cout<<"Size of primitive type\n"<<endl;
printf("Character : %dbyte(s)\n", sizeof(character_N));
printf("Integer : %dbyte(s)\n", sizeof(intager_N));
printf("Double : %dbyte(s)\n", sizeof(double_N));
cout<<endl<<endl;
}
<메모리 구조>
1. 포인터 사용하여 초기화하기
#include<stdio.h>
#include<iostream.h>
void main()
{
char character_N = 'a';
int intager_N = 1;
double double_N = 1;
char *character_Np = &character_N;
int *intager_Np = &intager_N;
double *double_Np = &double_N;
//주소출력-> ex)출력 : 0x1122ff (16진수형)
cout<<"Address of primitive type\n"<<endl;
printf("Character : 0x%x\n", &character_N); //0x12ff7c
printf("Integer : 0x%x\n", &intager_N); //0x12ff78
printf("Double : 0x%x\n", &double_N); //0x12ff70
cout<<endl<<endl;
//크기출력-> ex)출력 : 1e8byte(s)
cout<<"Size of primitive type\n"<<endl;
printf("Character : %dbyte(s)\n", sizeof(*character_Np));
printf("Integer : %dbyte(s)\n", sizeof(*intager_Np));
printf("Double : %dbyte(s)\n", sizeof(*double_Np));
cout<<endl<<endl;
}
<메모리 구조>
2. 다음 소스코드를 보고 엔디안 확인하기
int main()
{
int x = 0x01020304;
char *cp = (char *)&x;
printf("%X %X %X %X \n",
*cp,*(cp+1),
*(cp+2),*(cp+3));
return 0;
}
실행결과 : 4 3 2 1
->리틀 엔디안으로 확인됨. 아마도 04 03 02 01로 끓어서 나타냈을것이다. 작은 단위부터 출력되었다.
3. 포인터를 이용한 스와핑 함수 작성
#include<stdio.h>
void swap(int *x, int *y);
void main()
{
int a, b;
scanf("%d %d", &a, &b);
swap(&a, &b);
}
void swap(int *x, int *y){
int z;
z=*x;
*x=*y;
*y=z;
printf("%d %d\n", *x, *y);
}
4.메모리 주소에 대한 고찰
출력값은 주석처리 함.
#include<stdio.h>
void main(){
char c1 = 0;
char c2 = '0';
char *str = "0";
printf("0x%x\n", &c1); //0x12ff7c (정수값이므로 4바이트 떨어진 크기에서 시작)
printf("0x%x\n", &c2); //0x12ff78
printf("0x%x\n", str); //0x420024 (문자열의 시작주소를 의미)
}
5.hello world를 대문자로 출력
//아스키코드에서 대소문자가 32차이남.
#include<stdio.h>
void main()
{
char *str = "hello world";
char *newStr;
for(int i=0; i<str[i]; i++){
printf("%c", str[i]-32);
}
printf("\n");
}
실습(2)
문자처리
1) id는 알파벳 대소문자만 가능. 출력(저장)은 대문자로
2) password는 알파벳과 숫자가능. 출력은 소문자로
3) confirm number는 1자리 숫자만 가능. 출력은 그 값에 1024를 더한 값으로
#include<stdio.h>
void main()
{
char str_id[] = "MyIdisGood";
char str_passwd[] = "MyPass1234";
char str_confirm[] = "2";
int length=0;
char cnt=0;
//To print Bigger id
for(int i=0; i<str_id[i]; i++){
if((str_id[i]>='a')&&(str_id[i]<='z'))
str_id[i]-=32;
printf("%c", str_id[i]);
}
printf("\n");
//To pring Smaller pwd
for(int j=0; j<str_passwd[j]; j++){
if((str_passwd[j]>='A')&&(str_passwd[j]<='Z'))
str_passwd[j]+=32;
printf("%c", str_passwd[j]);
}
printf("\n");
//To Check confirm is only 1 character + integer 1024
for(int k=0; k<str_confirm[k]; k++){
length++;
if(length>=2){
printf("You can input only one of character!!\n");
}
if(((int)str_confirm[k]>=48) && ((int)str_confirm[k]<=57)){
printf("%d\n",*str_confirm + 1024);
}
}
}
1.1. 어떤 문자 하나를 인자로 받아서 그 문자가 10진수이면 참(1), 아니면 거짓(0)을 리턴하는 함수를 작성하시오(함수명은 MY_isdigit 로 작성할 것).
#include<stdio.h>
int flag;
bool MY_isdigit(char* x);
void main()
{
char a[10];
while(true){
printf("Enter!!!!!! : ");
scanf("%s", a);
MY_isdigit(a);
printf("Is that Decimal? : %d\n", MY_isdigit(a));
if(flag==10)
printf("Oh yeah~ Decimal~\n");
else if(flag==8)
printf("Sorry, That's OctaCode. try again man.\n");
else if(flag==16)
printf("Sorry, That's HexaCode. try again man.\n");
printf("\n");
}
}
//return MY_isdigit
bool MY_isdigit(char* x){//1
for(int i=0; i<10; i++){//2
if(x[0]=='0'){//3
flag=8;
return false;
if(x[1]=='x'){//4
flag=16;
return false;
}//4 <--16진수를 판별하는 부분인데.. 잘 되지 않는다... 왜지?
}//3
else{
flag=10;
return true;
}
}//2
}//1
1.2. 어떤 문자 하나를 인자로 받아서 그 문자가 알파벳 대문자이면 참(1), 아니면 거짓(0)을 리턴하는 함수를 작성하시오(함수명은 MY_isupper 로 작성할 것).
#include<stdio.h>
bool MY_isupper(char c){
if((c>='A')&&(c<='Z'))
return true;
else
return false;
}
void main()
{
char a;
printf("Enter any one character...\n");
printf("Input : ");
scanf("%c", &a);
printf("1(ture) or 0(false) ?\n");
printf("Result : %d\n", MY_isupper(a));
}
//MY_isupper(char c)
1.3. 어떤 문자 하나를 인자로 받아서 그 문자가 알파벳 소문자이면 참(1), 아니면 거짓(0)을 리턴하는 함수를 작성하시오(함수명은 MY_islower 로 작성할 것). ...뭐지? 이문제는 ㅋ
#include<stdio.h>
bool MY_islower (char c){
if((c>='a')&&(c<='z')) //범위값만 바꾸면....
return true;
else
return false;
}
void main()
{
char a;
printf("Enter any one character...\n");
printf("Input : ");
scanf("%c", &a);
printf("1(ture) or 0(false) ?\n");
printf("Result : %d\n", MY_islower (a));
}
//MY_islower (char c)
1.4. 어떤 문자 하나를 인자로 받아서 그 문자가 알파벳이면 참(1), 아니면 거짓(0)을 리턴하는 함수를 작성하시오(함수명은 MY_isalpha 로 작성할 것).
#include<stdio.h>
bool MY_isalpha(char c){
if(((c>='a')&&(c<='z')) || ((c>='A')&&(c<='Z')))
return true;
else
return false;
}
void main()
{
char a;
printf("Enter any one character...\n");
printf("Input : ");
scanf("%c", &a);
printf("1(ture) or 0(false) ?\n");
printf("Result : %d\n", MY_isalpha(a));
}
//MY_isalpha
1.5. 어떤 문자 하나를 인자로 받아서 그 문자가 10진수 혹은 알파벳이면 참(1), 아니면 거짓(0)을 리턴하는 함수를 작성하시오(함수명은 MY_isalnum 로 작성할 것).
#include<stdio.h>
bool MY_isalnum (char c){
if(((c>='a')&&(c<='z')) ||
((c>='A')&&(c<='Z')) ||
((c>='0')&&(c<='9')))
return true;
else
return false;
}
void main()
{
char a;
printf("Enter any one character...\n");
printf("Input : ");
scanf("%c", &a);
printf("1(ture) or 0(false) ?\n");
printf("Result : %d\n", MY_isalnum (a));
}
//MY_isalpha
1.6. 어떤 문자 하나를 인자로 받아서 그 문자가 알파벳 대문자이면 소문자로, 아니면 그대로 리턴하는 함수를 작성하시오(함수명은 MY_toupper 로 작성할 것).
#include<stdio.h>
char MY_toupper (char c){
if((c>='A')&&(c<='Z'))
return c+32;
else
return c;
}
void main()
{
char a;
printf("Enter any one character...\n");
printf("Input : ");
scanf("%c", &a);
printf("Result : %c\n", MY_toupper (a));
}
//MY_toupper
1.7. 어떤 문자 하나를 인자로 받아서 그 문자가 10진수이면 해당 숫자로, 아니면 -1을 리턴하는 함수를 작성하시오(함수명은 MY_tolower 로 작성할 것).
#include<stdio.h>
int MY_tolower(char c){
if((c>=0)&&(c<=9))
return c;
else
return -1;
}
void main()
{
int a;
printf("Enter any one character...\n");
printf("Input : ");
scanf("%d", &a);
printf("Result : %d\n", MY_tolower(a));
}
//MY_tolower
1.8. 어떤 문자 하나를 인자로 받아서 그 문자가 10진수이면 해당 숫자로, 아니면 -1을 리턴하는 함수를 작성하시오(함수명은 MY_tonumber 로 작성할 것).
#include<stdio.h>
int tonumber (char c){
if((c>=0)&&(c<=100))
return c;
else
return -1;
}
void main()
{
int a;
printf("Enter any one character...\n");
printf("Input : ");
scanf("%d", &a);
printf("Result : %d\n", tonumber (a));
}
1.9. 종합예제. 동작을 확인할 수 있도록 작성하시오.
#include<stdio.h>
#include<iostream.h>
void isNameApproch(char *name);
void isNumCorrect(int *num);
void main(){
char name[80];
int num;
cin>>name;
cin>>num;
isNameApproch(name);
isNumCorrect(&num);
}
void isNameApproch(char *name){
for(int i=0; i<sizeof((char)name); i++){
if((name[i]>='A')&&(name[i]<='Z'))
cout<<"You can only wrrite lawyer character"<<endl;
}
}
void isNumCorrect(int *num){
for(int i=0; i<sizeof((int)num); i++){
if((*num>='A')&&(*num<='Z') ||
(*num>='a')&&(*num<='z')){
cout<<"It's not Number fucker"<<endl;
}//if
}
}
int isalnum ( int c ); | c가 알파벳 또는 숫자이면 0이 아닌 값을 반환한다. |
int isalpha ( int c ); | c가 알파벳이면 0이 아닌 값을 반환한다. |
int iscntrl ( int c ); | c가 제어 문자이면 0이 아닌 값을 반환한다. |
int isdigit ( int c ); | c가 숫자이면 0이 아닌 값을 반환한다. |
int isgraph ( int c ); | c가 그래픽 문자이면 0이 아닌 값을 반환한다. |
int islower ( int c ); | c가 소문자이면 0이 아닌 값을 반환한다. |
int isprint ( int c ); | c가 출력할 수 있는 문자이면 0이 아닌 값을 반환한다. |
int ispunct ( int c ); | c가 구두점 문자이면 0이 아닌 값을 반환한다. |
int isspace ( int c ); | c가 공백 문자이면 0이 아닌 값을 반환한다. |
int isupper ( int c ); | c가 대문자이면 0이 아닌 값을 반환한다. |
int isxdigit ( int c ); | c가 16진 숫자이면 0이 아닌 값을 반환한다. |
문자 변환 | |
---|---|
int tolower ( int c ); | c를 소문자로 변환한다. |
int toupper ( int c ); | c를 대문자로 변환한다. |
문자열 처리
1.1. 문자열의 길이 계산하기(NULL을 제외한 길이 구하기).
#include<stdio.h>
int MY_strlen(char *src);
void main()
{
char str[] = "";
scanf("%s", str);
printf("%d\n", MY_strlen(str));
}
int MY_strlen(char *src){
int cnt=0;
for(int i=0; src[i]; i++)
cnt++;
return cnt;
}
1.2. 문자열 복사하기(dst 배열의 선두번지 리턴하기).
*어려웠음ㅠㅠ
#include<stdio.h>
char *MY_strcpy(char *src, char *dst);
void main()
{
char FirstString[80] = "abce";
char SecondString[80];
scanf("%c", FirstString);
//MY_strcpy(FirstString, SecondString);
for(int i=0; i<5; i++)
printf("%c", *MY_strcpy(FirstString, SecondString)+i);
printf("\n");
}
char *MY_strcpy(char *src, char *dst){
for(int i=0; i<5; i++){
*dst = *src + i;
//printf("%c", *dst);
return dst;
}
}
1.3. 문자열 비교하기(같으면 0, dst가 크면 1, dst가 작으면 -1).
#include<stdio.h>
int strcmp(char *String1, char *String2){
int cnt1=0;
int cnt2=0;
for(int i=0; String1[i]; i++){
cnt1++;
}
for(int j=0; String2[j]; j++){
cnt2++;
}
if(cnt1==cnt2){
printf("It's same length of between\n");
return 0;
}
else{
printf("It's not same!! man!!\n");
return 1;
}
}
void main()
{
char whatString1[100]="";
char whatString2[100]="";
int state;
scanf("%s %s", whatString1, whatString2);
state = strcmp(whatString1, whatString2);
printf("%d\n", state);
}
함수 | 설명 |
---|---|
복사 | |
void * memcpy ( void * destination, const void * source, size_t num ); | source가 가리키는 곳 부터 num바이트 만큼을 destination이 가리키는 곳에 복사한다. |
void * memmove ( void * destination, const void * source, size_t num ); | source가 가리키는 곳 부터 num바이트 만큼을 destination이 가리키는 곳으로 옮긴다. |
char * strcpy ( char * destination, const char * source ); | source를 destination에 복사한다. |
char * strncpy ( char * destination, const char * source, size_t num ); | source에서 destination으로 처음 num개의 문자들을 복사한다. |
병합 | |
char * strcat ( char * destination, const char * source ); | source를 destination뒤에 붙인다. |
char * strncat ( char * destination, char * source, size_t num ); | source에서 destination뒤에 처음 num개의 문자들을 붙인다. |
비교 | |
int memcmp ( const void * ptr1, const void * ptr2, size_t num ); | ptr1이 가리키는 처음 num바이트의 데이터와 ptr2가 가리키는 처음 num바이트의 데이터를 비교한다. |
int strcmp ( const char * str1, const char * str2 ); | str1과 str2를 비교한다. |
int strcoll ( const char * str1, const char * str2 ); | strcmp와 비슷하지만 LC_COLLATE에 정의되어 있는 방식에 따라 해석 된 후 비교한다. |
int strncmp ( const char * str1, const char * str2, size_t num ); | str1의 처음 num개의 문자를 str2의 처음 num개의 문자와 비교한다. |
size_t strxfrm ( char * destination, const char * source, size_t num ); | source를 현재 지역 정보에 따라 문자열을 변환한 후 변환한 문자열의 처음 num개 문자를 destination에 복사한다. |
탐색 | |
void * memchr ( const void * ptr, int value, size_t num ); | ptr이 가리키는 메모리의 처음 num바이트 중에서 처음으로 value와 일치하는 값(문자)의 주소를 반환한다. |
char * strchr ( const char * str, int character ); | str에서 처음으로 character와 일치하는 문자의 주소를 반환한다. |
size_t strcspn ( const char * str1, const char * str2 ); | str2에 들어있는 문자들 중 str1에 들어있는 문자와 일치하는 것이 있다면 첫번째로 일치하는 문자까지 읽어들인 수를 반환한다. |
char * strpbrk ( const char * str1, const char * str2 ); | str1에서 str2에 들어 있는 문자들을 찾아 str2의 문자들 중 str1의 문자들과 첫번째로 일치하는 문자의 주소를 반환한다. |
char * strrchr ( const char * str, int character ); | str에서 마지막으로 character와 일치하는 문자의 주소를 반환한다. |
size_t strspn ( const char * str1, const char * str2 ); | str2의 문자들만을 포함하고 있는 str1의 처음 부분의 길이를 구한다. |
char * strstr ( const char * str1, const char * str2 ); | str1에서 str2를 검색하여 가장 먼저 나타나는 곳의 위치를 반환한다. |
char * strtok ( char * str, const char * delimiters ); | str1을 delimiters의 문자들로 분리한다. |
기타 | |
void * memset ( void * ptr, int value, size_t num ); | ptr이 가리키는 메모리의 처음 num바이트를 value값(문자)으로 채운다. |
char * strerror ( int errnum ); | errnum(보통 errno)을 해석한 뒤 그에 해당하는 에러 문자열의 포인터를 반환한다. |
size_t strlen ( const char * str ); | str의 길이를 반환한다. |
실습(3)
1.1 문자열 복사 : strcpy
#include<stdio.h>
#include <string.h>
void main()
{
char src[5] = "abc";
char dst[5] = "";
strcpy(dst, src);
printf("%s\n", dst);
}
1.2 문자열 길이 구하기 : strlen
#include<stdio.h>
#include <string.h>
void main()
{
char src[5] = "abc";
int cnt;
printf("%d\n", strlen(src));
}
1.3 난수 관련 : rand/srand
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
printf("rand() : \n");
for(int i=10; i<=1000; i*=10){
printf("%d\n", rand() %i+1);
}
printf("\nsrand() : \n");
int arr[3];
srand((unsigned)char(NULL));
for(int j=0; j<3; j++){
arr[j] = rand();
printf("%d\n", arr[j]);
}
}
1.4 숫자로 변경 : atoi
#include<stdio.h>
#include<stdlib.h>
void main()
{
char a[80];
scanf("%s", &a);
int b = atoi(a);
printf("%d\n", b);
}
1.6 파워 연산 : pow
#include<stdio.h>
#include<math.h>
void main()
{
float a = 2;
float b;
printf("2의 몇제곱이 궁금하신가? : ");
scanf("%f", &b);
printf("2의 %.0f제곱은 : %.0f\n", b, pow(a, b));
}
1.7 메모리 셋팅 : memset (다시 봐야함)
#include<stdio.h>
#include<string.h>
void main()
{
char arr[10] = {'1','2','3','4','5','6','7','8','9','\0'};
memset(arr, 0, sizeof(arr));
for(int i=0; i<10; i++){
printf("%c\n", arr[i]);
}
}
실습(4)
1.1. 사용자로부터 정수를 10개 입력 받아서 인자로 전달된 정수형 배열에 저장하는 함수를 작성하시오.
#include<stdio.h>
int func(int *a);
void main(){
int a[10];
int b[10];
for(int i=0; i<10; i++)
scanf("%d", &a[i]);
for(int j=0; j<10; j++){
b[j] = func(a+j);
printf("%d\n", b[j]);
}
}
int func(int *a){
for(int j=0; j<10; j++){
return *(a+j);
}
}
1.2. 주어진 정수형 배열의 원소중 최대값, 최소값을 리턴하는 함수를 각각 작성하시오.
#include<stdio.h>
int Min(int *a);
int Max(int *b);
void main(){
int a[3]={100, 10, 20};
int max = Max(a);
int min = Min(a);
printf("%d\n%d\n", min, max);
}
int Min(int *a){
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
if(a[j]>a[j+1]){
int c;
c=a[j];
a[j]=a[j+1];
a[j+1]=c;
}
}
}
return a[0];
}
int Max(int *b){
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
if(b[j]<b[j+1]){
int c;
c=b[j];
b[j]=b[j+1];
b[j+1]=c;
}
}
}
return b[0];
}
1.3. 주어진 정수형 배열의 원소의 총합, 평균을 리턴하는 함수를 각각 작성하시오.
#include<stdio.h>
void total(int *x);
void average(int *x);
void main(){
int a[3] = {1,4,5};
total(a);
average(a);
}
void total(int *x){
int sum=0;
for(int i=0; i<3; i++){
sum += x[i];
}
printf("%d\n", sum);
}
void average(int *x){
int sum=0;
for(int i=0; i<3; i++){
sum += x[i];
}
printf("%d\n", sum/3);
}
2.1. 각각의 자료형 char, int, double, 사용자정의 자료형(구조체, 공용체)의 주소의 가감연산을 수행할 수 있도록 하고(배열 혹은 포인터 사용), 가감 연산(+, -, ++, --, +=, -=)을 수행해보시오.
#include<stdio.h>
struct MyStruct{
int StructInt1;
int StructInt2;
};
void main(){
MyStruct myStruct[2];
myStruct[0].StructInt1 = 98;
myStruct[1].StructInt2 = 0;
MyStruct *result;
for(int i=0; i<2; i++){
result = &myStruct[i];
result->StructInt1++;
result->StructInt2++;
}
int realResult = result->StructInt1 + result->StructInt2;
printf("%d\n", realResult);
}
2.2. 특히 assignment가 이루어 지는 연산(++,--,+=,-=)은 배열에서는 주의해야 한다. 예를 작성해 보시오.
?? 문제의 의도를 정확이 모르겠음.
2.3. ++,--는 후위 연산자 우선순위가 매우 중요하다. 특히 간접지정연산자(*)와 결합하였을 경우 값이 전혀 달라질 수 있다. 다음을 경우들을 고려해보고 왜 그렇게 되는지 생각해 보시오.
#include<stdio.h>
void main(){
int arr[4] = {1,2,3,4};
int *ptr = arr;
/*
printf("%x \n", ptr);
//단순히 시작 주소를 의미
printf("%x \n", ptr++);
//오리지널 '주소'값을 출력
printf("%x \n", ++ptr);
//업데이트 값을 출력, ++두번 수행으로 총8byte만큼 주소 증가
printf("%x \n", *ptr++);
//오리지널 값을 출력. *표시로 인해 메모리에 들어 있는 값이 출력.
printf("%x \n", (*ptr)++);
//오리지널 값이 출력되되, 업데이트가 적용된 메모리 속의 값.
*/
printf("-----------------------------------\n");
printf("%x \n",ptr++);
//시작 주소의 오리지널 값을 출력.
printf("%x \n",++ptr);
//오리지널의 업데이트 + 새로운 업데이트로 8byte만큼 증가된 주소값
printf("%x \n",*ptr++);
//오리지널 값을 출력. *표시로 인해 메모리에 들어 있는 값이 출력.
printf("%x \n",(*ptr)++);
//오리지널 값이 출력되되, 업데이트가 적용된 메모리 속의 값.
}
3. 구조체의 포인터를 이용하여 함수의 인자로 전달하거나 리턴을 받으면 유리한 경우가 많이있다. 예제를 작성해 보시오.
#include<stdio.h>
#include<iostream.h>
struct MyStruct{
int num;
char name[10];
};
void input(MyStruct *x);
void output(MyStruct *x);
void main(){
MyStruct obj[2];
for(int i=0; i<1; i++)
input(&obj[i]);
for(int j=0; j<1; j++)
output(&obj[j]);
}
void input(MyStruct *x){
printf("What's name? : ");
cin>>x->name;
printf("What's num? : ");
cin>>x->num;
}
void output(MyStruct *x){
printf("\n");
cout<<"your Name is "<<x->name<<endl;
cout<<"and your num is"<<x->num<<endl;
}
4. 종합예제를 작성해 보시오.
- 구조체의 배열 사용
- 배열의 인자전달 혹은 포인터에 의한 인자전달을 사용
#include<stdio.h>
#include<iostream.h>
struct Character{
int HP;
int ATK;
char *name;
};
void OnCreate(Character *p);
void Attack(Character *p);
void main(){
Character player[2];
for(int i=0; i<2; i++){
OnCreate(&player[i]);
Attack(&player[i]);
}
}
void OnCreate(Character *p){
p->name = "P1";
p->HP = 3;
p->ATK = 1;
}
void Attack(Character *p){
if(p->name == "P1"){
printf("you P1 Hits the P2\n");
}
}
실습(5)
1.단일 연결리스트를 이용해 FIFO 큐 작성
queue.h 코드
#ifndef QUEUE_H_
#define QUEUE_H_
typedef struct _node {
int value;
struct _node* next;
}node;
typedef node* nptr;
typedef struct _queue{
int count;
nptr front;
nptr rear;
}queue;
queue* create_queue(void);
void destroy_queue(queue* qptr);
void add_rear(queue* qptr, int value);
int remove_front(queue*);
#endif
메인 및 기타 함수 코드
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
queue* create_queue(){
queue* new_queue=(queue*)malloc(sizeof(queue));
new_queue->count=0;
new_queue->front=NULL;
new_queue->rear=NULL;
return new_queue;
}
void destroy_queue(queue* qptr){
while(qptr->count!=0){
remove_front(qptr);
}
free(qptr);
printf("Queue Destroy Complete\n");
}
void add_rear(queue* qptr, int value){
nptr new_node=(nptr)malloc(sizeof(node));
new_node->value=value;
new_node->next=NULL;
if (qptr->count==0){
qptr->front=new_node;
qptr->rear=new_node;
}
else{
qptr->rear->next=new_node;
qptr->rear=new_node;
}
qptr->count++;
}
int remove_front(queue* qptr){
if (qptr->count==0){
printf("There is no item in this queue.\n");
return -1;
}
else{
nptr tmp=qptr->front;
qptr->front=tmp->next;
int tmp_value=tmp->value;
free(tmp);
qptr->count--;
return;
}
}
int main(){
queue* myqueue=create_queue();
add_rear(myqueue,3);
add_rear(myqueue,4);
add_rear(myqueue,5);
add_rear(myqueue,6);
add_rear(myqueue,7);
add_rear(myqueue,8);
add_rear(myqueue,9);
printf("remove_front: %d\n",remove_front(myqueue));
printf("remove_front: %d\n",remove_front(myqueue));
printf("remove_front: %d\n",remove_front(myqueue));
printf("remove_front: %d\n",remove_front(myqueue));
printf("remove_front: %d\n",remove_front(myqueue));
printf("remove_front: %d\n",remove_front(myqueue));
printf("remove_front: %d\n",remove_front(myqueue));
printf("remove_front: %d\n",remove_front(myqueue));
printf("remove_front: %d\n",remove_front(myqueue));
printf("remove_front: %d\n",remove_front(myqueue));
destroy_queue(myqueue);
return 0;
}
1.1리스트의 형태변화 그리기
'C/C++' 카테고리의 다른 글
오버로딩시 주의사항 (0) | 2013.09.26 |
---|---|
도트매트릭스 제어 (1) | 2013.09.12 |
포인터로 배열 주고받기 (0) | 2013.09.09 |
c언어 동적할당 (0) | 2013.05.05 |
C언어 파일 + 구조체 (0) | 2013.05.05 |