1.知识百科
链表(Linked List)是计算机科学中一种基础的数据结构,通过节点(Node)的链式连接来存储数据。每个节点包含两部分:存储数据的元素和指向下一个节点的指针(单链表)或前后两个指针(双链表)。
- 常见操纵
插入:在头部、尾部或指定位置插入节点。
删除:删除指定节点(需处理惩罚指针指向)。
遍历:从头节点依次访问每个节点。
查找:按值或位置查找节点(需遍历)。
2.链表操纵
2.1 创建链表
创建一个链表,用于保存学生信息,分别存储姓名、学号和成绩。
- typedef struct STU{
- char name[50];
- char id[20];
- float score;
- struct STU *next;
- }STU_INFO,*P_STU;
复制代码 添加节点,每一个节点保存一位学生信息。
- /*录入信息*/
- void STU_Input(P_STU node)
- {
- printf("请输入姓名、学号、成绩:\n");
- scanf("%s%s%f",node->name,node->id,&node->score);
- while(getchar()!='\n');
- }
- /*
- 添加节点(尾插法)
- */
- void STU_AddNode(P_STU *head)
- {
- if(*head==NULL)
- {
- *head=malloc(sizeof(STU_INFO));//创建链表头
- (*head)->next=NULL;
- STU_Input(*head);//录入成员信息
- return ;
- }
- //链表头已存在
- P_STU phead=*head;
- //偏移指针,将phead指向链表尾
- while(phead->next!=NULL)
- {
- phead=phead->next;
- }
- //创建节点
- P_STU new_node=malloc(sizeof(STU_INFO));
- printf("添加节点:%p\n",new_node);
- phead->next=new_node;
- phead=phead->next;
- phead->next=NULL;//new_node->next=NULL;
- //录入信息
- STU_Input(new_node);//录入成员信息
- }
复制代码 2.2 遍历链表
遍历链表,查看所有学生信息。
- void STU_Output(P_STU head)
- {
- P_STU phead=head;//指向链表头
- while(phead!=NULL)
- {
- printf("姓名:%s 学号:%s 成绩:%.1f\n",phead->name,phead->id,phead->score);
- phead=phead->next;
- }
- }
复制代码 2.3 删除节点
根据名字查找子节点,并删除。
当删除的节点为中间节点,删除过程如下:
当删除的节点为头节点,删除过程如下:
节点删除代码实现如下,支持删除多个连续的重复节点。
- //查找子节点进行删除
- P_STU STU_FindNode_Del(P_STU head)
- {
- //判断链表头是否为NULL
- P_STU phead=head;
- P_STU temp=head,temp2;
- char name[50];
- printf("请输入要查找的名字:\n");
- scanf("%s",name);
- while(getchar()!='\n');
- while(phead!=NULL)
- {
- if(strcmp(phead->name,name)==0)
- {
- //要删除的数据在链表头
- if(phead==head)
- {
- temp=phead;
- phead=phead->next;
- free(temp);
- head=phead;
- }
- else{
- //要删除的数据不在链表头
- temp->next=phead->next;
- temp2=phead;
- phead=phead->next;
- free(temp2);//释放节点
- }
- }
- else //继续找下一个成员
- {
- temp=phead;
- phead=phead->next;//继续查找下一个成员
- }
- }
- return head;//返回链表头
- }
复制代码 测试示例:
- int main()
- {
- P_STU head=NULL;//定义一个结构体指针
- int i=0;
- //添加节点
- while(1)
- {
- STU_AddNode(&head);
- i++;
- if(i>=4)break;
- }
- printf("遍历链表\n");
- STU_Output(head);
- printf("删除节点\n");
- head=STU_FindNode_Del(head);
- printf("剩余成员信息\n");
- STU_Output(head);
- return 0;
- }
复制代码 运行效果:
- wbyq@wbyq-virtual-machine $ ./a.out
- 请输入姓名、学号、成绩:
- 1 1 1
- 请输入姓名、学号、成绩:
- 2 2 2
- 请输入姓名、学号、成绩:
- 2 2 2
- 请输入姓名、学号、成绩:
- 3 3 3
- 遍历链表
- 姓名:1 学号:1 成绩:1.0
- 姓名:2 学号:2 成绩:2.0
- 姓名:2 学号:2 成绩:2.0
- 姓名:3 学号:3 成绩:3.0
- 删除节点
- 请输入要查找的名字:
- 2
- 剩余成员信息
- 姓名:1 学号:1 成绩:1.0
- 姓名:3 学号:3 成绩:3.0
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |