学完oc再学c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct User {
int id;
char name[16];
struct User* next;
};
struct User user_header = {0};
void addToHeader(struct User* user) {
user->next = user_header.next;
user_header.next = user;
}
/* 这种写法是错误的,最终user_header中只会有2个元素:当前元素,和next元素,因为直接操作了user_header的值,正确做法应该是操作地址
void addToFooter(struct User* user) {
while(1) {
printf("add to footer --- id:%d, name:%s, next:%p\n", user->id, user->name, user->next);
if(user_header.next == NULL) {
user_header.next = user;
user->next = NULL;
break;
}
user_header = *user_header.next;
}
}
*/
void addToFooter(struct User* user) {
struct User* header = &user_header;
while(1) {
if(header->next == NULL) {
header->next = user;
user->next = NULL;
break;
}
header = header->next;
}
}
void insert(struct User* user) {
struct User *current = &user_header;
struct User *previous;
while(1) {
if(user->id < current->id) {
user->next = current;
previous->next = user;
break;
}
previous = current; // 这两步千万别颠倒,要不就死循环了
current = current->next;
}
}
void show(struct User* user) {
while(user) {
printf("id:%d, name:%s, next:%p\n", user->id, user->name, user->next);
user = user->next;
}
}
int main(int argc, char const *argv[]) {
//struct User u1 = {1, "simon", NULL};
//struct User u2 = {2, "teieka", NULL};
//addToFooter(&u1);
//addToFooter(&u2);
struct User* u1 = (struct User*)malloc(sizeof(struct User));
u1->id = 1;
strcpy(u1->name, "hello");
struct User* u2 = (struct User*)malloc(sizeof(struct User));
u2->id = 2;
strcpy(u2->name, "world");
struct User* u5 = (struct User*)malloc(sizeof(struct User));
u5->id = 5;
strcpy(u5->name, "!!!");
struct User* u6 = (struct User*)malloc(sizeof(struct User));
u6->id = 6;
strcpy(u6->name, "...");
addToFooter(u1);
addToFooter(u2);
addToFooter(u5);
addToFooter(u6);
struct User* u4 = (struct User*)malloc(sizeof(struct User));
u4->id = 4;
strcpy(u4->name, "***");
insert(u4);
show(&user_header);
return 0;
}