c언어로 덱을 구현해봤는데 오류가많이납니다...좀길지만 봐주시면 감사하겠습니다.

uyyhgdd의 이미지

#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는 실행오류가 납니다....이유를 모르겠네요..귀찮으시겠지만한번만봐주세요.ㅠ

yhsuk의 이미지

일단 주석문의 printf문이 이상하네요.. 마지막 printf는 잘 쓰셨는데?

printf("%d","%s",d.key,d.name);
-->
printf("%d -> %s\n",d.key,d.name);

로 변경하세요.

removelast 함수에서 if 비교문에서 할당이 이루어졌습니다.

if(deq->last->llink=NULL)
-->
if(deq->last->llink==NULL)

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"

uyyhgdd의 이미지

아감사합니다. 가장기본적인것에서 실수를햇는데 그걸놓쳤네요...말씀대로 조급해하지않고 천천히 살펴보겠습니다.

qiiiiiiiip의 이미지

올려주신 코드를 그대로 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)
         ^
klyx의 이미지

그냥 쭉 봤을 때 맥락상 틀렸을 것으로 생각되는 게 일단 두군데 보이네요.(검색으로 찾아보세요)

if(deq->first->rlink=NULL)

if(deq->last->llink=NULL)

uyyhgdd의 이미지

감사합니다. 봐주셔서

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.