#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
char name[20];
int age;
struct Student* next;
struct Student* prex;
};
struct Student* create_node(char name[20], int age) {
struct Student* p;
p = malloc(sizeof(struct Student));
//初始化数据
strcpy(p->name, name);
p->age = age;
p->next = NULL;
p->prex = NULL;
}
void list_tail_insert(struct Student* header, struct Student* new) {
struct Student* p = header;
while (NULL != p->next) {
p = p->next;
}
p->next = new;
new->prex = p;
}
void add_student(struct Student* header) {
char name[20];
int age;
printf("input your name:");
scanf("%s", name);
printf("input your age:");
scanf("%d", &age);
list_tail_insert(header, create_node(name, age));
}
int list_delete_node(struct Student* header, char name[20]) { //取得当前节点
struct Student* p = header;
//遍历所有的节点
while (NULL != p->next) {
p = p->next;
//找到了对应要删除的数据了
if (strcmp(p->name, name) == 0) {
//(1)当前节点的下一个节点不为空
if (p->next != NULL) {
//那就把当前节点的prev节点指向要删除的这个节点的prev
因为当前的prev节点保存的是要删除的上一个节点的指针
p->next->prex = p->prex;
//还要指定它的next节点
p->prex->next = p->next;
free(p);
} else {
p->prex->next = NULL;
free(p);
} //(2)当前节点的下一个节点为空
printf("Delete successed!\n");
return 0;
}
}
printf("No finding the node,or node is deleted!\n");
return -1;
}
void delete_student(struct Student* header) {
char name[20];
printf("input your delete name:");
scanf("%s", name);
list_delete_node(header, name);
}
void list_for_each(struct Student* header) {
struct Student* p = header;
while (NULL != p->next) {
p = p->next;
printf("%s\t", p->name);
printf("%d\n", p->age);
}
}
int main() {
struct Student* header = create_node("", 0);
while (1) {
char choice;
printf("please input a word(a:add,d:delete,s:show):\n");
choice = getchar();
switch (choice) {
case 'a':
add_student(header);
break;
case 'd':
delete_student(header);
break;
case 's':
list_for_each(header);
break;
case 'q':
return 0;
case '\n':
break;
default:
break;
}
}
return 0;
}
这段代码是用C语言编写的,主要功能是创建、删除和遍历一个链表,链表中的每个节点都表示一个学生,包括他们的名字和年龄。以下是对各个函数的具体解释:
create_node函数:创建新的节点,需要输入名字和年龄。该函数使用malloc为新节点分配内存,然后使用strcpy复制名字,将年龄赋值给新节点,最后将新节点的next和prex设置为NULL。
list_tail_insert函数:在链表的末尾插入新的节点。该函数首先遍历链表直到找到最后一个节点,然后将新节点插入到该节点之后,同时将新节点的prex指向该节点。
add_student函数:向链表中添加新的学生。首先获取用户输入的名字和年龄,然后使用create_node创建一个新的节点,最后使用list_tail_insert将新节点插入到链表的末尾。
list_delete_node函数:删除链表中的特定节点。该函数遍历链表,当找到名字与输入一致的节点时,会删除该节点。如果当前节点的next节点不为空,那么需要将当前节点的prex节点的next指向当前节点的next,同时将当前节点的next的prex指向当前节点的prex。如果当前节点的next为空,那么只需要将当前节点的prex的next设置为NULL。
delete_student函数:删除特定的学生。首先获取用户输入的名字,然后调用list_delete_node删除名字与输入一致的节点。
list_for_each函数:遍历链表并打印出每个学生的名字和年龄。
注意:这段代码没有处理错误输入的情况,例如当用户输入的名字超过20个字符时,程序可能会出现问题。另外,对于删除操作,如果输入的名字与链表中没有任何一个节点的名字一致,那么程序会输出"No finding the node,or node is deleted!",这可能不是预期的结果,可能需要进一步修改代码来处理这种情况。
Linux下运行结果: