// 解答7.5 list.c(解答6.4に追加) #include #include // 環境によっては不要 typedef enum { false=0, true=1 } bool; // 線形リストの型定義 typedef struct list { int val; struct list *next; } List; // テスト対象のプロトタイプ宣言 void input_list(List *l) { int v; List *p=l; p->val = -1; // dummy while (scanf("%d", &v)>0) { List *newp = (List*)malloc(sizeof(List)); newp->val = v; p->next = newp; p = p->next; } } // 新規作成する List *new_list(int n) { List *r = (List*)malloc(sizeof(List)); List *p = r; p->val = -1; for (int i=0;ival = 0; p->next = newp; p = p->next; } return r; } // 別のリストからコピーする List *copy(const List *l) { List *r = (List*)malloc(sizeof(List)); List *p = r; p->val = -1; List *q = l->next; for (;q;q=q->next) { List *newp = (List*)malloc(sizeof(List)); newp->val = q->val; p->next = newp; p = p->next; } return r; } // リストを結合する. 引数は変化しない List *concat(const List *l1,const List *l2) { List *r = (List*)malloc(sizeof(List)); List *p = r; p->val = -1; List *q = l1->next; for (;q;q=q->next) { List *newp = (List*)malloc(sizeof(List)); newp->val = q->val; p->next = newp; p = p->next; } q = l2->next; for (;q;q=q->next) { List *newp = (List*)malloc(sizeof(List)); newp->val = q->val; p->next = newp; p = p->next; } return r; } // リストを削除する void delete_list(List *l) { List *p = l->next; while (p) { List *newp = p->next; free(p); p = newp; } free(l); } // 出力(テスト用) void print_list(const List *l) { List *p = l->next; for (;p;p=p->next) { printf("(%d,0x%x)", p->val, p->next); } printf("\n"); } // リストの要素の重複を検査する bool duplicated(const List *l) { List *lp = l->next; for (; lp; lp=lp->next) { List *lp2 = lp->next; for (; lp2; lp2=lp2->next) { if (lp->val == lp2->val) return true; } } return false; } List list; // テスト関数 void test_list_op() { input_list(&list); List *x1 = new_list(3); print_list(x1); List *x2 = copy(&list); print_list(x2); List *x3 = concat(x2,x1); print_list(x3); delete_list(x1); print_list(x1); List *x4 = copy(x3); print_list(x4); } int main() { test_list_op(); return 0; }