C语言-链表


特点

空间不连续,不可以支持随机访问,插入删除的效率高

链表定义

typedef struct NODE{
    int num;
    struct NODE* next;  //指向下一地址的指针
}Node;

链表的创建

微信图片_20220110162640

//有头指针的头插法
#include
#include

typedef struct NODE {
	int num;
	struct NODE* next;
}Node;

void printList(Node* p) {				//链表打印
	while (p) {
		printf("%d ", p->num);
		p = p->next;
	}
}

void freeList(Node* p) {				//链表的释放
	Node* t = NULL;
	while (p) {
		t = p->next;
		free(p);
		p = t;
	}
}

Node* findNode(Node* p, int num) {		//链表查找
	while (p) {
		if (p->num == num) {
			return p;
		}
		p = p->next;
	}
	return NULL;
}

void deleteNode(Node* p, int num) {		//链表删除
	if (p == NULL) {
		return;
	}
	Node* q = p;
	p = p->next;//p比q多走一步
	while (p) {
		if (p->num == num) {//删除节点
			q->next = p->next;
			free(p);
			break;
		}
		q = p;
		p = p->next;
	}
}

void insertNode(Node* p, int findNum, int newNum) {		//链表添加
	Node* q = p;
	p = p->next;//p比q多走一步
	while (p) {
		if (p->num == findNum) {//插入节点
			Node* t = malloc(sizeof(Node));
			t->num = newNum;
			t->next = p;
			q->next = t;
			break;
		}
		q = p;
		p = p->next;
	}
	//找不到findNum不处理
}


int main() {
	Node* head = malloc(sizeof(Node));
	head->next = NULL;
	int number = 0;
	while (1) {
		scanf("%d", &number);
		if (number <= 0) {
			break;
		}
		Node* p = malloc(sizeof(Node));
		p->num = number;
		p->next = head->next;
		head->next = p;
	}

	//修改节点
	Node* t = findNode(head->next, 10);
	if (t != NULL) {
		t->num = 20;
	}
	//删除节点
	deleteNode(head, 10);
	//增加节点
	insertNode(head, 10, 50);
	//查找节点
	Node* t = findNode(head->next, 10);
	//修改节点
	if (t != NULL) {
		t->num = 20;
	}
	//打印链表
	printList(head->next);
	//释放链表
	freeList(head);

	return 0;
}

链表的打印

eabea457d5dc631c9d637ab08703982

void printList(Node* p){
    while(p){
        printf("%d ",p->num);
        p = p->next;
    }
}

链表的释放

33b5382d3e9b94ba710f9d3fa556065

void freeList(Node* p){
    Node* t = NULL;
    while(p){
        t = p->next;
        free(p);
        p = t;
    }
}

查找节点

Node* findNode(Node* p,int num){
    while(p){
        if(p->num == num){
            return p;
        }
        p = p->next;
    }
    return NULL;
}

修改节点

Node* t = findNode(head->next,10);
if(t!=NULL){
    t->num = 20;
}

删除节点

4f74f985f922dfbb235442c94f4a038

void deleteNode(Node* p,int num){
    if(p == NULL){
        return;
    }
    Node* q = p;
    p = p->next;//p比q多走一步
    while(p){
        if(p->num ==num){//删除节点
            q->next = p->next;
            free(p);
            break;
        }
        q = p;
        p = p->next;
    }
}

插入节点

4dcdc5c8789af07045e56dbcf7a6427

void insertNode(Node* p,int findNum,int newNum){
    Node* q = p;
    p = p->next;//p比q多走一步
    while(p){
        if(p->num == findNum){//插入节点
        Node* t = malloc(sizeof(Node));
        t->num = newNum;
        t->next = p;
        q->next = t;
        break;
        }
        q = p;
        p = p->next;
    }
    //找不到findNum不处理
}