有问题欢迎讨论,单链表的入门练习,插入可以自动排序。
//
// Created by sq on 2022/4/21.
//
//DEV_MIAN_CPP
//list/mian.cpp
#include<iostream>
#include <string.h>
typedef struct Node{
char name[20];
int data;
Node *next;
}Node;
void InsertNod(Node **p, int data, char *name){
Node *node = (Node *) malloc(sizeof(Node));
Node *q = *p;
node->data = data;
strcpy(node->name, name);
//添加在链表头
if((*p)->next == NULL || node->data <= (*p)->next->data){
node->next = (*p)->next;
(*p)->next = node;
return;
}
while (q->next != NULL){
//添加在链表尾
if(node->data >= q->next->data && q->next->next == NULL){
q->next->next = node;
node->next = NULL;
break;
}
//添加在链表体中
if(node->data >= q->next->data && node->data < q->next->next->data){
node->next = q->next->next;
q->next->next = node;
break;
}
q = q->next;
}
}
void printfNode(Node **p){
Node *q = *p;
while(q->next != NULL){
printf("用户:%s 数据:%d\n", q->next->name, q->next->data);
q = q->next;
}
}
void freeNode(Node **p){
Node *tmp = NULL, *q;
if(p == NULL){
return;
}
q = (*p)->next;
while(q != NULL){
tmp = q;
q = q->next;
free(tmp);
}
}
void deleteNode(Node **p, int n){
Node *node = NULL;
if(p == NULL){
return;
}
Node *q = *p;
while(q->next != NULL){
if(q->next->data == n){
node = q->next;
q->next = q->next->next;
printf("删除了结点用户:%s 数据:%d\n", node->name, node->data);
free(node);
return;
}
q = q->next;
}
printf("链表中没有结点数据:%d, 删除失败", n);
}
void selectNode(Node **p, int n){
if(p == NULL){
return;
}
Node *q = *p;
while(q->next != NULL){
if(q->next->data == n){
printf("查询到用户:%s 数据:%d\n", q->next->name, q->next->data);
break;
}
q = q->next;
}
}
void updateNode(Node **p, int n, int newNum){
if(p == NULL){
printf("未修改任何结点。");
return;
}
Node *q = *p;
while(q->next != NULL){
if(q->next->data == n){
q->next->data = newNum;
printf("修改用户:%s 数据:%d 新数据为:%d\n", q->next->name, n, q->next->data);
break;
}
q = q->next;
}
}
int main() {
Node *head = (Node *) malloc(sizeof(Node));
head->next = NULL;
//添加结点
char sq1[20] = "sq1";
char sq2[20] = "sq2";
char sq3[20] = "sq3";
char sq4[20] = "sq4";
InsertNod(&head, 1, sq1);
InsertNod(&head, 3, sq3);
InsertNod(&head, 2, sq2);
InsertNod(&head, 4, sq4);
//删除结点
deleteNode(&head,2);
//查询结点
selectNode(&head, 3);
//修改结点
updateNode(&head, 4, 44);
//打印结点
printfNode(&head);
//释放内存
freeNode(&head);
return 0;
}
怕什么真理无穷,进一寸有进一寸的欢喜 --胡适