링크리스트(연결리스트) add, delete, list 질문
글쓴이: 다방커피 / 작성시간: 토, 2018/10/13 - 12:52오전
항상 고수분들 답변 눈팅만 해오면서
알고리즘 몇개 공부해가는 학생이었는데
정말 고민끝에 염치없지만 긴 문제하나 질문드립니다ㅜㅜ
C언어를 이용한 링크드리스트 문제입니다
a를 누르면 add를실행
d를 누르면 delete를 실행
p를 누르면 print_list를 실행 같은 프로그램입니다.
먼저 add를 사용 입력받은 문자열과(name)과 숫자(number)을( 이때 문자열은 항상 3자 숫자는 항상 4자)
문자열크기에 맞춰 새로운 노드에 add, delete, list하는 문제입니다
new_node(), add(), delete(), print_list() 함수를 완성하는건데
아무리 짜봐도 프로그램이 제대로 작동하질 않습니다.
먼저 main.c와 backend.c 마지막 backend.h 헤더까지 입니다.
main.c는 압박이므로 자세히 보지않아도 될듯합니다
#include <stdio.h>
#include <stdlib.h> // Necessary for exit()
#include "backend3.h"
#define WELCOME_MESSAGE "Welcome to Address Book!\n"
#define COMMAND_PROMPT "ADDR>"
#define ADD_PROMPT "ADD NAME>>"
#define SEARCH_PROMPT "SEARCH NAME>>"
#define NUMBER_PROMPT "ENTER NUMBER>>>"
#define DELETE_PROMPT "DELETE NAME>>"
int prompt_command(char *, char *);
int prompt_name(char *, char *);
int prompt_number(char *, char *);
int main()
{
char command[1];
char name[3], number[4];
init_pool();
printf(WELCOME_MESSAGE);
while (1) {
restart:
if (prompt_command(COMMAND_PROMPT, command) != 0 )
goto restart;
switch (command[0]) {
case 'A':
case 'a':
if (prompt_name(ADD_PROMPT, name) !=0)
goto restart;
if (prompt_number(NUMBER_PROMPT, number) !=0)
goto restart;
add(name, number);
break;
case 'S':
case 's':
if (prompt_name(SEARCH_PROMPT, name) !=0)
goto restart;
search(name);
break;
case 'D':
case 'd':
if (prompt_name(DELETE_PROMPT, name) !=0)
goto restart;
delete(name);
break;
case 'Q':
case 'q':
printf("Quitting ... \n");
return 0;
case 'P':
case 'p':
print_list();
break;
default:
printf("Please enter a valid command.\n");
goto restart;
}
}
}
int prompt_command(char *s, char *p)
{
char *q;
char c;
while (1) {
printf("%s ", s);
fflush(stdout);
q=p;
while (1) {
c=getchar();
if (c==EOF)
exit(-1); // Should let exit() take care of the sudden EOF.
if (c=='\n')
break;
if (q<p+1)
*q=c;
q++;
}
if (q==p+1)
return 0; // got a good command //
if (q==p)
return 1; // just a <return> //
printf("Please type a command.\n");
}
}
int prompt_name(char *s, char *p)
{
char *q;
char c;
while (1) {
printf("%s ", s);
fflush(stdout);
q=p;
while (1) {
c=getchar();
if (c==EOF)
exit(-1); // Should let exit() take care of the sudden EOF.
if (c=='\n')
break;
if (q<p+3)
*q=c;
q++;
}
if (q==p+3)
return 0; // got a good name //
if (q==p)
return 1; // just a <return> //
printf("Please type a three-letter name.\n");
}
}
int prompt_number(char *s, char *p)
{
char *q;
char c;
while (1) {
printf("%s ", s);
fflush(stdout);
q=p;
while (1) {
c=getchar();
if (c==EOF)
exit(-1); // Should let exit() take care of the sudden EOF.
if (c=='\n')
break;
if (q<p+4)
*q=c;
q++;
}
if (q==p+4)
return 0; // got a good number //
if (q==p)
return 1; // just a <return> //
printf("Please type a four-digit number.\n");
}
return 0;
}이어서 제일 중요한 backend.c 입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "backend3.h"
#define POOL_SIZE 5
// pool of memory
struct record pool[POOL_SIZE];
struct record * top=pool; // pool is constant. We need a pointer variable for stack top.
// comparison function for records
int compare(char key[3], struct record *);
// data
struct record * data = NULL; // Initially NULL.
void init_pool() // Initialize the pool
{
int i;
struct record *r=pool;
struct record *s;
pool[POOL_SIZE-1].next=NULL;
for(i=1;i<POOL_SIZE;i++) {
s=r++;
s->next=r;
}
}
// Get a node from the pool. Exit if pool is empty.
struct record * new_node()
{
struct record* r;
if (top == NULL) {
printf("new_node() was not implemented.\n");
printf("Pool is empty\n");
exit(0);
}
else {
r = top;
top = r->next;
return r;
}
// Push a node to the pool.
void free_node(struct record *r)
{
r->next=top;
top=r;
}
void add(char *name, char *number)
{
printf("add() was not implemented.\n");
// Error Message for duplicate name
// printf("Can't add. The name already exists!\n");
}
void search(char name[3])
{
struct record *r=data;
int result;
while(r!=NULL && (result=compare(name,r))>0)
r=r->next;
if(r==NULL || result<0)
printf("Couldn't find the name.\n");
else {
print_name(r);
printf(" : ");
print_number(r);
printf(" was found.\n");
}
}
void delete(char name[3])
{
struct record* r = top;
if (compare(name, r) == 0) {
struct record* s = r->next;
r = s;
r->next = s->next;
}
else
{
while (1) {
struct record* s = r->next;
if (compare(name, s) == 0) {
r->next = s->next;
break;
}
else
{
printf("no found\n");
printf("delete() is not implemented.\n");
break;
}
}
}
}
/* Just a wrapper of strncmp(), except for the case r is NULL.
Negative value if key is less than r.
0 if key and r are equal.
Positive value if key is greater than r. */
int compare(char key[3], struct record *r)
{
if (r==NULL)
return -1;
else
return strncmp(key, r->name, 3);
}
// Prints ith name.
void print_name(struct record *r)
{
print_data(r->name, 3);
}
// Prints ith number.
void print_number(struct record *r)
{
print_data(r->number, 4);
}
void print_data(char * s, int n)
{
int i;
for (i=0; i<n; i++)
putchar(s[i]);
}
void print_list()
{
printf("print_list() was not implemented.\n");
}마지막 헤더입니다.
void add(char [3], char [4]);
void search(char [3]);
void delete(char [3]);
// record structure
struct record {
char name[3];
char number[4];
struct record * next;
};
void print_name(struct record *);
void print_number(struct record *);
void print_data(char *, int);
void print_list();
void init_pool();일단 new_node(), delete 까지는 구현을 해놨습니다. 맞는지는 잘모르겠지만..
근데 null을 포함해서 받는strncpy 를 쓴것이 문제인가(3자리를 받는데 이러면 뒤에 null까지 4자리를받아서?)
그냥 제가 짠 add함수 자체의 문제인가는 모르겠지만
add를 해봐도 추가되었다고 나오지를 않습니다...
제가 짠 add가 있긴한데 너무 추잡합니다ㅠㅠㅠ
제발 도움좀주세요ㅜㅜㅜ
File attachments:
| 첨부 | 파일 크기 |
|---|---|
| 187.69 KB |
Forums:


일단은 실행은 된다는 거죠?
일단은 실행은 된다는 거죠?
컴파일 할 때
gcc -Wall
해서 Warning 메시지까지 잘 살펴보셔요.
void add(char *name, char *number) { printf("add() was not implemented.\n"); // Error Message for duplicate name // printf("Can't add. The name already exists!\n"); }add 함수를 위와 같이 했다면 결과가 안 나오는 게 맞는데요?
https://wiki.kldp.org/wiki.php/DocbookSgml/Beginner_QA-KLDP#AEN70
세벌 https://sebuls.blogspot.kr/
댓글 달기