链表
1. 因为数组是静态分配存储空间,以后不能修改,链表是动态
2. 链表分为数据域和指针域
定义结构体
1. 不能这样定义,因为此时在{}内部还没有NODE
typedef {
char name[10];
int num;
NODE *next;
} NODE;
2. 无法在定义结构体时赋初值,不起作用
struct Node{
char name[10] = {0};
int num;
struct Node *next = NULL;
};
typedef struct Node NODE;
创建结点
NODE *createNode(char *_name, int *_num) {
NODE *temp = (NODE *)malloc(sizeof(NODE));
memcpy(temp->name, _name, strlen(_name)+1);
temp->num = *_num;
temp->next = NULL;
return temp;
}
删除结点
void deleteNode(NODE *p) {
if(NULL != p) {
free( p );
p = NULL;
}
}
末尾追加结点
void append(NODE **head, char *_name, int _num) {
NODE *temp = createNode(_name, &_num);
NODE *p = *head; //当前结点
NODE *pf = *head; //上一个结点
// 不能用p
if(NULL == *head) {
*head = temp;
} else {
while (p != NULL) {
pf = p;
p = p->next;
}
pf->next = temp;
}
}
删除指定结点
void deleteSomeNode(NODE **head, char *_name) {
NODE *temp;
NODE *p = *head;
NODE *pf = *head;
if(NULL == p) {
return;
}
while( p ) {
// 找到结点
if(0 == strcmp(p->name, _name)) {
temp = p;
// 在第一个
if(p == *head) {
*head = p->next;
p = *head;
pf = *head;
// 在最后一个
} else if(p->next == NULL) {
pf->next = NULL;
p = NULL;
// 在中间
} else {
pf->next = p->next;
p = pf->next;
}
deleteNode(temp);
} else {
pf = p;
p = p->next;
}
}
}
打印输出
void printfNode(NODE *head) {
NODE *p = head;
while ( p ) {
printf("%s ", p->name);
p = p->next;
}
printf("\n");
}
插入
void insert(NODE **head, char *_name, int _num, char *someone) {
NODE *temp = createNode(_name, &_num);
NODE *p = *head;
NODE *pf = *head;
// 不能用p
if(NULL == *head) {
*head = temp;
} else {
while (p != NULL) {
if(0 == strcmp(p->name, someone)) {
pf->next = temp;
temp->next = p;
return;
} else {
pf = p;
p = p->next;
}
}
pf->next = temp;
}
}
int main(int argc, char *argv[])
{
NODE *head = NULL;
printf("*** appent ***\n");
append(&head, "1", 100);
append(&head, "2", 200);
append(&head, "3", 300);
append(&head, "4", 400);
printfNode(head);
printf("*** delete ***\n");
deleteSomeNode(&head, "1");
printfNode(head);
deleteSomeNode(&head, "3");
printfNode(head);
deleteSomeNode(&head, "4");
printfNode(head);
printf("*** insert ***\n");
insert(&head, "4", 400, "2");
printfNode(head);
insert(&head, "3", 300, "2");
printfNode(head);
insert(&head, "100", 100, "2");
printfNode(head);
deleteSomeNode(head, "3");
deleteSomeNode(head, "4");
printfNode(head);
}