#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 第三週:
based on 第二週的題目
1. 請確定 list 中的 10 elements 分別有一 index 欄位用來識別他是第幾個 entries
2. 請刪除 index 5 , 7 的 entries
3. 請在 list 的結尾新增一 index 11 的 entries
4. 請將此 list 印出
*/
struct data {
char name[16];
unsigned long height;
unsigned short index;
struct data *next;
}stu;
typedef struct data Node;
void show(struct data *stu);
Node *create_list(char **arr, unsigned long *arr1, unsigned short *arr2, int);
Node print_list(Node *);
void free_list(Node *);
Node *search_node(Node *, int);
Node *delete_node(Node *, Node *);
void *insert_node(Node *node, char *arr3, unsigned long *arr1, int item);
int main()
{
struct data stu = {"Kerwin", 177, 77};
Node *first, *node;
char *arr[] = {"Ariza", "Bryant", "Clarkson", "Divac", "Ennis", "Fisher", "Gasol", "Horry", "Ingram", "Johnson"};
unsigned long arr1[] = {203, 198, 196, 216, 191, 185, 213, 206, 206, 206};
unsigned short arr2[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
first = create_list(arr, arr1, arr2, 10);
node = search_node(first, 5);
first = delete_node(first, node);
node = search_node(first, 7);
first = delete_node(first, node);
node = search_node(first, 10);
insert_node(node, "Kuzma", 206, 11);
print_list(first);
free_list(first);
return 0;
}
void show(struct data *stu)
{
printf("%8s\t%3d\t%7d\n\n", stu
->name
, stu
->height
, stu
->index
); }
Node *create_list(char **arr, unsigned long *arr1, unsigned short *arr2, int len)
{
int i;
Node *first = NULL,*current = NULL,*previous = NULL;
for (i=0;i<len;i++) {
current
=(Node
*) malloc(sizeof(Node
)); memset(current
, 0, sizeof(Node
)); if (current){
if (i == 0) {
first = current;
}else {
previous->next = current;
}
strcpy(current
->name
, arr
[i
]); current->height = arr1[i];
current->index = arr2[i];
current->next = NULL;
previous = current;
}
}
return first;
}
Node print_list(Node *first)
{
Node *data = first;
if (first == NULL){
}else{
while (data != NULL) {
printf("%8s\t%3d\t\t%3d\n", data
->name
, data
->height
, data
->index
); data = data->next;
}
}
}
void free_list(Node *first)
{
Node *current = NULL, *tmp = NULL;
current = first;
while (current != NULL) {
tmp = current;
current = current->next;
}
}
Node *search_node(Node *first, int item)
{
Node *node = first;
while (node != NULL) {
if (node->index == item) {
return node;
}else{
node = node->next;
}
}
return NULL;
}
Node *delete_node(Node *first, Node *node)
{
Node *ptr = first;
if (first == NULL) {
printf("Nothing to delete!\n"); return NULL;
}
if (node == first) {
first = first->next;
}else{
while (ptr->next != node) {
ptr = ptr->next;
}
ptr->next = node->next;
}
return first;
}
void *insert_node(Node *node, char *arr3, unsigned long *arr1, int item)
{
Node *newnode;
newnode
= (Node
*) malloc(sizeof(Node
)); newnode->height = arr1;
newnode->index = item;
newnode->next = node->next;
node->next = newnode;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLyog56ys5LiJ6YCxOgoKICAgYmFzZWQgb24g56ys5LqM6YCx55qE6aGM55uuCgogICAxLiDoq4vnorrlrpogbGlzdCDkuK3nmoQgMTAgZWxlbWVudHMg5YiG5Yil5pyJ5LiAIGluZGV4IOashOS9jeeUqOS+huitmOWIpeS7luaYr+esrOW5vuWAiyBlbnRyaWVzCgogICAyLiDoq4vliKrpmaQgaW5kZXggNSAsIDcg55qEIGVudHJpZXMKCiAgIDMuIOiri+WcqCBsaXN0IOeahOe1kOWwvuaWsOWinuS4gCBpbmRleCAxMSDnmoQgZW50cmllcwoKICAgNC4g6KuL5bCH5q2kIGxpc3Qg5Y2w5Ye6CiAgIAoqLwoKc3RydWN0IGRhdGEgewoJY2hhciBuYW1lWzE2XTsKCXVuc2lnbmVkIGxvbmcgaGVpZ2h0OwoJdW5zaWduZWQgc2hvcnQgaW5kZXg7CglzdHJ1Y3QgZGF0YSAqbmV4dDsKfXN0dTsKCgp0eXBlZGVmIHN0cnVjdCBkYXRhIE5vZGU7Cgp2b2lkIHNob3coc3RydWN0IGRhdGEgKnN0dSk7Ck5vZGUgKmNyZWF0ZV9saXN0KGNoYXIgKiphcnIsIHVuc2lnbmVkIGxvbmcgKmFycjEsIHVuc2lnbmVkIHNob3J0ICphcnIyLCBpbnQpOwpOb2RlIHByaW50X2xpc3QoTm9kZSAqKTsKdm9pZCBmcmVlX2xpc3QoTm9kZSAqKTsKTm9kZSAqc2VhcmNoX25vZGUoTm9kZSAqLCBpbnQpOwpOb2RlICpkZWxldGVfbm9kZShOb2RlICosIE5vZGUgKik7CnZvaWQgKmluc2VydF9ub2RlKE5vZGUgKm5vZGUsIGNoYXIgKmFycjMsIHVuc2lnbmVkIGxvbmcgKmFycjEsIGludCBpdGVtKTsKCmludCBtYWluKCkKewogICAgCglzdHJ1Y3QgZGF0YSBzdHUgPSB7IktlcndpbiIsIDE3NywgNzd9OwoJCglOb2RlICpmaXJzdCwgKm5vZGU7CgljaGFyICphcnJbXSA9IHsiQXJpemEiLCAiQnJ5YW50IiwgIkNsYXJrc29uIiwgIkRpdmFjIiwgIkVubmlzIiwgIkZpc2hlciIsICJHYXNvbCIsICJIb3JyeSIsICJJbmdyYW0iLCAiSm9obnNvbiJ9OwoJdW5zaWduZWQgbG9uZyBhcnIxW10gPSB7MjAzLCAxOTgsIDE5NiwgMjE2LCAxOTEsIDE4NSwgMjEzLCAyMDYsIDIwNiwgMjA2fTsKCXVuc2lnbmVkIHNob3J0IGFycjJbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH07CgkKCQoJZmlyc3QgPSBjcmVhdGVfbGlzdChhcnIsIGFycjEsIGFycjIsIDEwKTsKCglub2RlID0gc2VhcmNoX25vZGUoZmlyc3QsIDUpOwoJZmlyc3QgPSBkZWxldGVfbm9kZShmaXJzdCwgbm9kZSk7CgkKCW5vZGUgPSBzZWFyY2hfbm9kZShmaXJzdCwgNyk7CglmaXJzdCA9IGRlbGV0ZV9ub2RlKGZpcnN0LCBub2RlKTsKCQoJCglub2RlID0gc2VhcmNoX25vZGUoZmlyc3QsIDEwKTsKCWluc2VydF9ub2RlKG5vZGUsICJLdXptYSIsIDIwNiwgIDExKTsKCQoJcHJpbnRfbGlzdChmaXJzdCk7CglmcmVlX2xpc3QoZmlyc3QpOwoJc3lzdGVtKCJwYXVzZSIpOwoJcmV0dXJuIDA7Cn0KCgp2b2lkIHNob3coc3RydWN0IGRhdGEgKnN0dSkKewogICAgIHByaW50ZigiJThzXHQlM2RcdCU3ZFxuXG4iLCBzdHUtPm5hbWUsIHN0dS0+aGVpZ2h0LCBzdHUtPmluZGV4KTsKfQoKTm9kZSAqY3JlYXRlX2xpc3QoY2hhciAqKmFyciwgdW5zaWduZWQgbG9uZyAqYXJyMSwgdW5zaWduZWQgc2hvcnQgKmFycjIsIGludCBsZW4pCnsKCWludCBpOwoJTm9kZSAqZmlyc3QgPSBOVUxMLCpjdXJyZW50ID0gTlVMTCwqcHJldmlvdXMgPSBOVUxMOwoJCglmb3IgKGk9MDtpPGxlbjtpKyspIHsKCQljdXJyZW50PShOb2RlICopIG1hbGxvYyhzaXplb2YoTm9kZSkpOwoJCW1lbXNldChjdXJyZW50LCAwLCBzaXplb2YoTm9kZSkpOwoJCWlmIChjdXJyZW50KXsKCQkJaWYgKGkgPT0gMCkgewoJCQkJZmlyc3QgPSBjdXJyZW50OwoJCQkJCgkJCX1lbHNlIHsKCQkJCXByZXZpb3VzLT5uZXh0ID0gY3VycmVudDsKCQkJfQoJCQoJCXN0cmNweShjdXJyZW50LT5uYW1lLCBhcnJbaV0pOwoJCWN1cnJlbnQtPmhlaWdodCA9IGFycjFbaV07CgkJY3VycmVudC0+aW5kZXggPSBhcnIyW2ldOwoJCWN1cnJlbnQtPm5leHQgPSBOVUxMOwoJCXByZXZpb3VzID0gY3VycmVudDsKCQl9Cgl9CgkKCXJldHVybiBmaXJzdDsKfQoKTm9kZSBwcmludF9saXN0KE5vZGUgKmZpcnN0KQp7CglOb2RlICpkYXRhID0gZmlyc3Q7CglpZiAoZmlyc3QgPT0gTlVMTCl7CgkJcHJpbnRmKCJMaXN0IGlzIGVtcHR5IVxuIik7Cgl9ZWxzZXsKCQl3aGlsZSAoZGF0YSAhPSBOVUxMKSB7CgkJCXByaW50ZigiJThzXHQlM2RcdFx0JTNkXG4iLCBkYXRhLT5uYW1lLCBkYXRhLT5oZWlnaHQsIGRhdGEtPmluZGV4KTsKCQkJZGF0YSA9IGRhdGEtPm5leHQ7CgkJfQoJCXByaW50ZigiXG4iKTsKCX0KfSAKCnZvaWQgZnJlZV9saXN0KE5vZGUgKmZpcnN0KQp7CglOb2RlICpjdXJyZW50ID0gTlVMTCwgKnRtcCA9IE5VTEw7CgljdXJyZW50ID0gZmlyc3Q7Cgl3aGlsZSAoY3VycmVudCAhPSBOVUxMKSB7CgkJdG1wID0gY3VycmVudDsKCQljdXJyZW50ID0gY3VycmVudC0+bmV4dDsKCQlmcmVlKHRtcCk7Cgl9Cn0KCk5vZGUgKnNlYXJjaF9ub2RlKE5vZGUgKmZpcnN0LCBpbnQgaXRlbSkKewoJTm9kZSAqbm9kZSA9IGZpcnN0OwoJd2hpbGUgKG5vZGUgIT0gTlVMTCkgewoJCWlmIChub2RlLT5pbmRleCA9PSBpdGVtKSB7IAoJCQlyZXR1cm4gbm9kZTsgCgkJfWVsc2V7CgkJCW5vZGUgPSBub2RlLT5uZXh0OyAKCQl9Cgl9CglyZXR1cm4gTlVMTDsKfQoKTm9kZSAqZGVsZXRlX25vZGUoTm9kZSAqZmlyc3QsIE5vZGUgKm5vZGUpCnsKCU5vZGUgKnB0ciA9IGZpcnN0OwoJaWYgKGZpcnN0ID09IE5VTEwpIHsKCQlwcmludGYoIk5vdGhpbmcgdG8gZGVsZXRlIVxuIik7CgkJcmV0dXJuIE5VTEw7Cgl9CglpZiAobm9kZSA9PSBmaXJzdCkgewoJCWZpcnN0ID0gZmlyc3QtPm5leHQ7Cgl9ZWxzZXsKCQl3aGlsZSAocHRyLT5uZXh0ICE9IG5vZGUpIHsKCQkJcHRyID0gcHRyLT5uZXh0OwoJCX0KCQlwdHItPm5leHQgPSBub2RlLT5uZXh0OwoJfQoJZnJlZShub2RlKTsKCXJldHVybiBmaXJzdDsKfQoKdm9pZCAqaW5zZXJ0X25vZGUoTm9kZSAqbm9kZSwgY2hhciAqYXJyMywgdW5zaWduZWQgbG9uZyAqYXJyMSwgaW50IGl0ZW0pCnsKCU5vZGUgKm5ld25vZGU7CgluZXdub2RlID0gKE5vZGUgKikgbWFsbG9jKHNpemVvZihOb2RlKSk7CglzdHJjcHkobmV3bm9kZS0+bmFtZSwgYXJyMyk7CgluZXdub2RlLT5oZWlnaHQgPSBhcnIxOwoJbmV3bm9kZS0+aW5kZXggPSBpdGVtOwoJbmV3bm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Cglub2RlLT5uZXh0ID0gbmV3bm9kZTsKfQo=