c언어로 덱을 구현해봤는데 오류가많이납니다...좀길지만 봐주시면 감사하겠습니다.
글쓴이: uyyhgdd / 작성시간: 수, 2015/05/20 - 8:33오후
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
int key;
char name[10];
char grade;
}element;
typedef struct doubleListNode{
element data;
struct doubleListNode *rlink;
struct doubleListNode *llink;
}deqNode;
typedef struct{
deqNode* first;
deqNode* last;
int lenth;
}deque;
deque* creatdeque() //공백 이중연결덱 형성
{
deque *deq;
deq=(deque*)malloc(sizeof(deque));
deq->first=NULL;
deq->last=NULL;
deq->lenth=0;
return deq;
}
int isEmpty(deque*deq){
if(deq->lenth==0)
return 1;
else
return 0;
}
void insertFirst(deque *deq,element item)
{ //연결덱에 첫번째 원소 삽입
deqNode *newnode;
newnode=(deqNode*)malloc(sizeof(deqNode));
newnode->data=item;
if(deq->lenth==0)
{deq->first=newnode;
deq->last=newnode;
newnode->llink=NULL;
newnode->rlink=NULL;
}
else
{
deq->first->llink=newnode;
newnode->rlink=deq->first;
newnode->llink=NULL;
deq->first=newnode;
}
deq->lenth++;
}
void insertLast(deque* deq,element item)
{
deqNode* newnode; //연결덱의 마지막 원소삽입
newnode=(deqNode*)malloc(sizeof(deqNode));
newnode->data=item;
if(deq->lenth==0)
{
newnode->llink=NULL;
newnode->rlink=NULL;
deq->first=newnode;
deq->last=newnode;
}
else
{
deq->last->rlink=newnode;
newnode->llink=deq->last;
newnode->rlink=NULL;
deq->last=newnode;
}
deq->lenth++;
}
element deletefirst(deque* deq)
{
deqNode* temp; //연결덱에서 첫번째 원소를 삭제하고 반환
element item;
if(deq->lenth==0)
{
printf("덱이 비었습니다.");
exit(1);
}
else
{
item=deq->first->data;
temp=deq->first;
if(deq->first->rlink=NULL) //원소가 하나일때
{
deq->first=NULL;
deq->last=NULL;
}
else
{
deq->first=deq->first->rlink; //원소가 2이상일때
deq->first->llink=NULL;
}
deq->lenth--;
free(temp);
return item;
}
}
element deletelast(deque* deq)
{
element item;
deqNode* temp; //연결덱에서 마지막 원소를 삭제하고 반환
if(deq->lenth==0)
{
printf("덱이 비었습니다.");
exit(1);
}
else
{ item=deq->last->data;
temp=deq->last;
if(deq->last->llink==NULL)
{
deq->first=NULL;
deq->last=NULL;
}
else
{
deq->last=deq->last->llink;
deq->last->rlink=NULL;
}
deq->lenth--;
free(temp);
return item;
}
}
void removefirst(deque* deq)
{ //연결덱에서 첫번째원소삭제
deqNode * temp;
if(deq->lenth==0)
{
printf("덱이비었습니다.");
exit(1);
}
else
{
temp=deq->first;
if(deq->first->rlink==NULL)
{deq->first=NULL;
deq->last=NULL;
}
else
{
deq->first=deq->first->rlink;
deq->first->llink=NULL;
}
deq->lenth--;
free(temp);
}
}
void removelast(deque* deq)
{ //연결덱에서 마지막원소삭제
deqNode*temp;
if(deq->lenth==0)
{
printf("덱이비었습니다");
exit(1);
}
else
{
temp=deq->last;
if(deq->last->llink=NULL)
{
deq->first=NULL;
deq->last=NULL;
}
else
{
deq->last=deq->last->llink;
deq->last->rlink=NULL;
}
deq->lenth--;
free(temp);
}
}
element peekfirst(deque *deq)
{
if(deq->lenth==0) //연결덱에서 첫번째 원소를 검색해서 반환
{
printf("덱이 비었습니다.");
exit(1);
}
else
{
return deq->first->data;
}
}
element peeklast(deque *deq)
{
if(deq->lenth==0) //연결덱에서 마지막 원소를 검색해서 반환
{
printf("덱이 비었습니다");
exit(1);
}
else
{
return deq->last->data;
}
}
int main()
{
deque*deq;
element a,b,c,d;
a.key=201501514;
strcpy(a.name,"김영희");
b.key=201501515;
strcpy(b.name,"김철수");
c.key=201501516;
strcpy(c.name,"홍길동");
deq=creatdeque();
insertFirst(deq,a);
insertLast(deq,b);
insertLast(deq,c);
//d=deletefirst(deq);
//printf("%d","%s",d.key,d.name);
//d=deletelast(deq);
//printf("%d","%s",d.key,d.name);
//removefirst(deq);
//removelast(deq);
//d=peeklast(deq);
//printf("%d","%s",d.key,d.name);
d=peekfirst(deq);
printf("%d %s",d.key,d.name);
system("pause");
return 0;
}길지만 봐주시면 정말감사하겠습니다... insertfirst와 insertlast 를 실행한뒤 peeklast를 실행하면 쓰레기값이 나오고.
또 removelast deletlast는 실행오류가 납니다....이유를 모르겠네요..귀찮으시겠지만한번만봐주세요.ㅠ
Forums:


일단 주석문의 printf문이 이상하네요.. 마지막
일단 주석문의 printf문이 이상하네요.. 마지막 printf는 잘 쓰셨는데?
로 변경하세요.
removelast 함수에서 if 비교문에서 할당이 이루어졌습니다.
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
아감사합니다. 가장기본적인것에서 실수를햇는데
아감사합니다. 가장기본적인것에서 실수를햇는데 그걸놓쳤네요...말씀대로 조급해하지않고 천천히 살펴보겠습니다.
올려주신 코드를 그대로 copy paste해서 컴파일
올려주신 코드를 그대로 copy paste해서 컴파일 해보았습니다.
컴파일할때는 항상 -Wall 옵션을 주고,
이렇게 발생하는 warning을 반드시 확인하고, 가능하면 모두 없애야 합니다.
$ gcc -Wall a.c -o a a.c: In function 'deletefirst': a.c:96:9: warning: suggest parentheses around assignment used as truth value [-Wparentheses] if(deq->first->rlink=NULL) //원소가 하나일때 ^ a.c: In function 'removelast': a.c:177:9: warning: suggest parentheses around assignment used as truth value [-Wparentheses] if(deq->last->llink=NULL) ^그냥 쭉 봤을 때 맥락상 틀렸을 것으로 생각되는 게
그냥 쭉 봤을 때 맥락상 틀렸을 것으로 생각되는 게 일단 두군데 보이네요.(검색으로 찾아보세요)
if(deq->first->rlink=NULL)
if(deq->last->llink=NULL)
감사합니다. 봐주셔서
감사합니다. 봐주셔서
댓글 달기