企业级开发链表思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述项目结构
在这里插入图片描述头文件代码

在这里插入图片描述头文件代码LinkList.h

#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
// 链表小节点
typedef struct LINKBODE {
    struct LINKBODE* next;


}LinkNode;
// 遍历的函数指针
typedef void(*PRINTNODE)(LinkNode*);
// 比较的函数指针
typedef int(*COMPARENODE)(LinkNode*, LinkNode*);



// 链表节点
typedef struct LINKLIST {
    LinkNode head;
    int size;
}LinkList;



// 初始化链表
LinkList* Init_LinkList();
// 插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data);
// 删除
void Remove_LinkList(LinkList* list, int pos);
// 查找
int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare);
// reback
int Size_LinkList(LinkList* list);
// 打印
void Print_LinkList(LinkList* list, PRINTNODE print);
// 释放链表
void FreeSpace_LinkList(LinkList* list);

#endif

cpp代码截图
在这里插入图片描述cpp文件详细代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "LinkList.h"


typedef struct PERSON {
    // 链表的节点,属于是进行链接的挂钩
    LinkNode node;
    char name[64];
    int age;

}Person;


// 回调函数
void MyPrint(LinkNode* data) {
    Person* p = (Person*)data;
    printf("Name = %s Age = %d\n", p->name, p->age);
}

// 回调函数
int MyCompare(LinkNode* node1, LinkNode* node2) {
	// 强制类型转换
	Person* p1 = (Person*)node1;
	Person* p2 = (Person*)node2;
	// 判断
	if (strcmp(p1->name, p2->name) == 0 && p1->age == p2 -> age) {
		return 0;
	}
	return -1;
}

// 初始化链表
LinkList* Init_LinkList() {
	// 使用这种方式初始化的链表不需要分配头结点
	LinkList* list = (LinkList*)malloc(sizeof(LinkList));
	list->head.next = NULL;
	list->size = 0;
	return list;
};
// 插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data) {
	// 对链表的参数进行判断
	if (list == NULL) {
		return;
	}
	if (data == NULL) {
		return;
	}
	if (pos < 0 || pos > list->size) {
		pos = list->size;
	}
	// 插入节点,查找插入位置(辅助指针变量)
	LinkNode* pCurrent = &(list->head);
	for (int i = 0; i < pos; i++) {
		pCurrent = pCurrent->next;
	}
	// 插入新的节点
	data->next = pCurrent->next;
	pCurrent->next = data;
	list->size++;

};
// 删除
void Remove_LinkList(LinkList* list, int pos) {
	// 判断
	if (list == NULL) {
		return;
	}
	if (pos < 0 || pos >= list->size) {
		return;
	}
	// 辅助指针变量
	LinkNode* pCurrent = &(list->head);
	for (int i = 0; i < pos; i++) {
		pCurrent = pCurrent->next;

	}
	// 删除节点
	pCurrent->next = pCurrent->next->next;
	list->size--;

};
// 查找
int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare) {
	if (list == NULL) {
		return -1;
	}
	if (data == NULL) {
		return -1;
	}
	// 辅助指针变量进行遍历,获取到第一个数据
	LinkNode* pCurrent = list->head.next;
	int index = 0;
	int flag = -1;
	// 使用while循环进行遍历
	while (pCurrent != NULL) {
		// 判断,如果相等的话就返回0如果不相等的话就返回-1
		if (compare(pCurrent, data) == 0) {
			flag = index;
			break;
		}

		pCurrent = pCurrent->next;
		index++;
	}
	return flag;

};
// reback
int Size_LinkList(LinkList* list) {
	return 0;

};
// 打印
void Print_LinkList(LinkList* list, PRINTNODE print) {
	if (list == NULL) {
		return;
	}
	// 使用辅助指针变量进行遍历
	LinkNode* pCurrent = list->head.next;
	// 使用while循环
	while (pCurrent != NULL) {
		print(pCurrent);
		pCurrent = pCurrent->next;
	}


};
// 释放链表
void FreeSpace_LinkList(LinkList* list) {
	// 释放内存空间,根据初始化的内容进行释放
	if (list == NULL) {
		return;
	}
	free(list);

};




int main(void)
{
    // 创建一个链表
    LinkList* list = Init_LinkList();
    // 创建数据
    Person p1, p2, p3, p4, p5;
    // 拷贝赋值
    strcpy(p1.name, "aaa");
    strcpy(p2.name, "nnn");
    strcpy(p3.name, "hhh");
    strcpy(p4.name, "qqq");
    strcpy(p5.name, "www");

    p1.age = 10;
    p2.age = 20;
    p3.age = 30;
    p4.age = 40;
    p5.age = 50;
    
    // 将节点插入到链表:企业级链表相当于是将指针串联起来,同时带上数据,实际上并没有上传数据
    Insert_LinkList(list, 0, (LinkNode*)&p1);
    Insert_LinkList(list, 0, (LinkNode*)&p2);
    Insert_LinkList(list, 0, (LinkNode*)&p3);
    Insert_LinkList(list, 0, (LinkNode*)&p4);
    Insert_LinkList(list, 0, (LinkNode*)&p5);
    // 打印
    Print_LinkList(list, MyPrint);


		    // 删除节点
			Remove_LinkList(list, 2);
			// 打印
			printf("--------------------\n");
			Print_LinkList(list, MyPrint);




	// 查找
	Person findP ;
	strcpy(findP.name, "aaa");
	findP.age = 10;
	int pos = Find_LinkList(list,(LinkNode*)&findP, MyCompare);
	printf("位置 = %d\n", pos);


    // 释放链表内存
    FreeSpace_LinkList(list);
    system("pause");
    return 0;

}

程序运行结果展示
在这里插入图片描述

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大数相乘的双向链表思路可以分为以下几个步骤: 1. 考虑链表数据结构:双向链表需要有pre和next指针,用于连接前一个节点和后一个节点。同时,还需要设置头节点和尾节点,其中头节点是一个虚节点,尾节点指向最后一个实际节点。这样可以更方便地进行链表操作。 2. 输入两个大整数,并将它们转化为链表形式存储。可以使用一个循环读取大整数的每一位,并将其插入到链表的尾部,以保证链表中的元素顺序与大整数的位数相对应。 3. 创建一个结果链表用于存储相乘的结果。首先,将结果链表初始化为空链表。然后,通过遍历链表中的每一位数,进行相乘运算,并将结果插入到结果链表中。注意,在乘法运算时,可能会出现进位的情况,需要特别处理。同时,还要注意保持结果链表的倒序表示,即头节点后面连接着结果的最后一位数。 4. 最后,将结果链表转化为大整数的形式,以便输出。 综上所述,大数相乘的双向链表思路主要包括链表数据结构设计、大整数的链表存储和相乘结果的链表表示。通过这种方式,可以更方便地进行大数相乘计算。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [链表问题3——大整数相乘](https://blog.csdn.net/weixin_30648963/article/details/98516217)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值