실습(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

}

}


1.10. 문자처리 라이브러리 확인하기 (<ctype.h> 확인)

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);

}



1.4. 문자열 처리 라이브러리 확인하기 (<string.h> 확인)
함수설명
복사
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
,