02.【數據結構-C語言】順序表(線性表概念、順序表實現:增刪查、前向聲明、順序表實現通訊錄項目:增刪改查、通訊錄數據導入及保存到本地文件)

目錄

1.?線性表

2. 順序表概念及分類

2.1 順序表的概念

2.2 順序表分類

2.3 動靜態順序表對比

3. 順序表的實現(附完整版代碼)

3.1 順序表結構體聲明

3.2?初始化&銷毀

3.3?插入(尾插、頭插、指定位置之前插入)

3.4?擴容

3.5?刪除(尾刪、頭刪、指定位置刪除)

3.6?查找(查找數據下標)

4. 順序表實現通訊錄(附完整版代碼)

4.1?前向聲明

4.2 通訊錄結構體聲明&順序表結構體修改

4.3 初始化&銷毀(直接調用順序表)

4.4 添加聯系人(直接調用順序表)

4.5 刪除聯系人

4.6 修改聯系人信息

4.7 查找聯系人

5. 通訊錄保存到文件

5.1 保存函數和加載函數

5.2 通訊錄初始化和銷毀函數修改


1.?線性表

????????線性表(linear list)是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構,常見的線性表:順序表、鏈表、棧、隊列、字符串...

????????線性表在邏輯上是線性結構,也就說是連續的一條直線。但是在物理結構上并不一定是連續的,線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲。(物理結構就是物理上的存儲結構)

????????案例:蔬菜分為綠葉類、瓜類、菌菇類。線性表指的是具有部分相同特性的一類數據結構的集合如何理解邏輯結構和物理結構?

2. 順序表概念及分類

2.1 順序表的概念

????????順序表和數組的區別:順序表的底層結構是數組,對數組的封裝,實現了常用的增刪改查等接口。

? ? ? ? 順序表的特性:邏輯結構是連續的,物理結構是連續的(順序表底層是數組,數組是連續的)。

2.2 順序表分類

????????順序表分為靜態順序表動態順序表

????????靜態順序表:使用定長數組存儲元素

struct SeqList
{int arr[100];// 定長數組int size;    // 順序表當前有效的數據個數
};

????????動態順序表:動態內存開啟,數組大小可以動態調整。

struct SeqList
{int* arr;    // 指向動態內存開辟的空間int size;    // 順序表當前有效的數據個數int capacity;// 動態申請的空間大小
};

2.3 動靜態順序表對比

靜態順序表動態順序表
數組給小了,空間不夠用;數組給大了,空間浪費。動態增容

? ? ? ? 動態順序表相比于靜態順序表有很大優勢。

3. 順序表的實現(附完整版代碼)

? ? ? ? 完整版順序表實現代碼:【免費】順序表-C語言實現代碼資源-CSDN下載

3.1 順序表結構體聲明

? ? ? ? 順序表的結構體一般有三個成員變量:存儲的數據的類型的指針(重定義以下,方便以后對其他類型使用)、順序表當前有效數據的個數、動態申請的空間的大小

? ? ? ? 同時可以給順序表結構體重定義,方便以后使用。

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int SLDataType;		// 類型重定義,方便以后修改為其他類型的數據typedef struct SeqList
{SLDataType* arr;// 指向動態內存開辟的空間int size;		// 順序表當前有效的數據個數int capacity;	// 動態申請的空間大小
}SL;			// 重定義結構體類型名,方便以后使用

3.2?初始化&銷毀

// 順序表初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}// 順序表銷毀
void SLDestory(SL* ps)	
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}

3.3?插入(尾插、頭插、指定位置之前插入)

? ? ? ? 順序表插入分為:尾插、頭插、指定位置之前插入

? ? ? ? 每次插入之前要判斷現有空間是否足夠,不夠時要進行擴容,見3.4節。

? ? ? ? 實現了SLInsert指定位置之前插入之后,可以直接復用到尾插、頭插中。

注意:

? ? ? ? 1. 插入時要對傳入的指針判斷,避免傳入指針為空指針,可以用assert斷言。

? ? ? ? 2. 指定位置之前插入的形參pos要進行判斷,插入的位置是否在順序表內部。如果不在內部執行插入時可能會越界訪問導致程序出錯。

//順序表尾插
void SLPushBack(SL* ps, SLDataType x)	
{assert(ps);		// 避免這種情況的發生SLPushBack(NULL, 2);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}//順序表頭插
void SLPushFront(SL* ps, SLDataType x)	
{assert(ps);		// 避免這種情況的發生SLPushBack(NULL, 2);SLCheckCapacity(ps);// 順序表中的內容整體往后挪動一位for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;ps->size++;//SLInsert(ps, 0, x);
}//指定位置之前插入數據
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);		// 避免這種情況的發生SLPushBack(NULL, 2);assert(pos >= 0 && pos <= ps->size);	// 確保pos在ps->arr的里面SLCheckCapacity(ps);for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}

3.4?擴容

? ? ? ? 在順序表空間不夠時需要擴容,每一種插入都要判斷擴容,所以將擴容單獨寫成一個函數。

? ? ? ? 擴容的規則:動態增容,一般以2倍或3倍的形式增加。

// 擴容
void SLCheckCapacity(SL* ps)	
{if (ps->size == ps->capacity){	// 申請空間int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;int* tmp = (SLDataType*)realloc(ps->arr, sizeof(SLDataType) * newCapacity);if (tmp == NULL){perror("realloc");exit(1);	// 直接退出程序,不在繼續執行}ps->arr = tmp;ps->capacity = newCapacity;}
}

3.5?刪除(尾刪、頭刪、指定位置刪除)

? ? ? ? 順序表的刪除分為:尾刪、頭刪、指定位置刪除。

注意:

? ? ? ? 1. 頭刪、尾刪要保證順序表不為空。

? ? ? ? 2. 指定位置刪除,要保證pos在順序表內部,否則可能出現越界訪問導致程序運行出錯。

// 尾刪
void SLPopBack(SL* ps)	
{assert(ps);assert(ps->size);//保證順序表不為空ps->size--;
}// 頭刪
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);//保證順序表不為空for (int i = 0; i < ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}//指定位置刪除數據
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >=0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

3.6?查找(查找數據下標)

? ? ? ? 沒查找到時,確保返回值不在ps->size內部。

// 查找數據的位置
int SLFind(SL* ps, SLDataType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x)return i;}return -1;
}

4. 順序表實現通訊錄(附完整版代碼)

? ? ? ? 完整通訊錄實現代碼:【免費】通訊錄程序實現-C語言順序表實現資源-CSDN下載

4.1?前向聲明

4.1.1 前向聲明是什么?

????????定義:在類型完整定義出現之前,先聲明其存在的機制

????????本質:告訴編譯器"這個類型存在,具體細節稍后提供"

????????前向聲明是C/C++解決類型聲明與定義分離的核心機制,通過允許"先聲明后定義":

????????????????1. 解決了頭文件循環依賴問題

????????????? ? 2. 實現了接口與實現的分離

? ? ? ? ? ? ? ? 3. 提高了編譯效率和代碼可維護性

C 語言允許 只聲明一個結構體類型而不提供完整定義(稱為“不完全類型”或“前向聲明”)。typedef struct SeqList Contact; 只是告訴編譯器:struct SeqList 是一個合法的類型(但暫時不知道它的具體內容)。Contact 是它的別名。編譯器不需要知道 struct SeqList 的完整定義,只要知道它是一個有效的類型名即可。

4.1.2 前向聲明的關鍵特性

特性說明示例
不完整類型編譯器知道類型存在,但不知道其大小和結構struct SeqList;
延遲定義具體定義可以稍后提供Contact.h聲明→SeqList.h定義
指針友好可以創建指向該類型的指針Contact* ptr;
成員不可訪問不能訪問結構體成員c.size = 10; // 會報錯

4.1.3?為什么這種設計有效?

????????單向依賴:

????????????????SeqList.h → 需要 Contact.h(因使用 peoInfo)

????????????????Contact.h → 不需要 SeqList.h(只需聲明 struct SeqList 存在)

????????編譯過程:

????????????????編譯 Contact.h 時:知道 struct SeqList 是合法類型名

????????????????編譯 SeqList.h 時:已獲得 peoInfo 的完整定義

????????????????最終使用者(如 main.c)同時包含兩者,獲得完整信息

4.1.4 前向聲明使用規則

? ? ? ? 1. 允許的操作

????????????????? 僅需類型名(不訪問成員)

????????????????? 定義類型別名:typedef struct S T;

????????????????? 函數參數/返回值:void func(struct S*);

????????????????? 聲明指針/引用:struct S* p;

? ? ? ? 2. 禁止的操作

????????????????? 實例化對象:struct S obj;

????????????????? 訪問成員:p->member = 0;

????????????????? 計算大小:sizeof(struct S)

????????????????? 非指針類型成員:struct X { struct S s; };

????????3. 核心原則

????????????????只聲明類型存在,不提供結構細節

????????????????必須在使用前提供完整定義

????????????????主要用于打破頭文件循環依賴

????????4. 典型用途

????????????????解決相互依賴:A.h 和 B.h 互相引用時

????????????????隱藏實現:接口聲明指針,實現文件定義結構體

????????????????減少編譯依賴:避免不必要頭文件包含

4.1.5?Contach.h 和 SeqList.h 頭文件包含問題

? Contact.h 不需要包含 SeqList.h

????????因為 typedef struct SeqList Contact; 只是聲明,不涉及 struct SeqList 的成員訪問。

? SeqList.h 必須包含 Contact.h

????????因為它用到了 peoInfo 的具體定義(typedef peoInfo SLDataType;)。

4.2 通訊錄結構體聲明&順序表結構體修改

1. 順序表頭文件修改(arr數組修改為存入數據的類型即可)

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Contact.h"//typedef int SLDataType;		// 類型重定義,方便以后修改為其他類型的數據
typedef peoInfo SLDataType;
// 動態順序表
typedef struct SeqList
{SLDataType* arr;// 指向動態內存開辟的空間int size;		// 順序表當前有效的數據個數int capacity;	// 動態申請的空間大小
}SL;			// 重定義結構體類型名,方便以后使用

2.通訊錄結構體聲明(注意前向聲明,見4.1詳解)

// 宏定義通訊錄成員數組的最大長度
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100// 通訊錄結構體聲明
typedef struct personInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}peoInfo;// 要用到順序表相關的方法,對通訊錄的實際操作就是對順序表進行操作
// 給順序表起個名字,叫做通訊錄
// 前向聲明
typedef struct SeqList Contact;

4.3 初始化&銷毀(直接調用順序表)

//初始化通訊錄
void ContactInit(Contact* con)
{// 實際上要進行的是順序表的初始化// 順序表的初始化已經實現好了,直接調用即可SLInit(con);
}//銷毀通訊錄數據
void ContactDestroy(Contact* con)
{SLDestory(con);
}

4.4 添加聯系人(直接調用順序表)

//添加通訊錄數據
void ContactAdd(Contact* con)
{peoInfo info;printf("請輸入要添加的聯系人姓名:");scanf("%s", info.name);printf("請輸入要添加的聯系人性別:");scanf("%s", info.gender);printf("請輸入要添加的聯系人年齡:");scanf("%d", &info.age);printf("請輸入要添加的聯系人電話:");scanf("%s", info.tel);printf("請輸入要添加的聯系人地址:");scanf("%s", info.addr);// 往通訊錄中添加數據SLPushBack(con, info);printf("添加成功\n\n");
}

4.5 刪除聯系人

? ? ? ? 需要確定:按照什么方式查找要刪除的數據(此處按照姓名查找,字符串比較要用strcmp,調用FindByName函數找到對應姓名的下標)

? ? ? ? 找到下標后,調用順序表的指定位置刪除函數。

int FindByName(Contact* con, char* name)
{for (int i = 0; i < con->size; i++){if (strcmp(con->arr[i].name, name) == 0)return i;}return -1;
}//刪除通訊錄數據
void ContactDel(Contact* con)
{// 要刪除的數據必須存在才可以執行刪除操作char name[NAME_MAX];printf("請輸入要刪除的數據的姓名:");scanf("%s", name);int find = FindByName(con, name);if (find == -1){printf("要刪除的數據的姓名不存在!!\n\n");return;}SLErase(con, find);printf("刪除成功!\n\n");
}

4.6 修改聯系人信息

? ? ? ? 通過FindByName()查找到要修改的聯系人姓名的下標之后,直接scanf修改。

//修改通訊錄數據
void ContactModify(Contact* con)
{char name[NAME_MAX];printf("請輸入要修改的數據的姓名:");scanf("%s", name);int find = FindByName(con, name);if (find == -1){printf("要修改的數據的姓名不存在!!\n\n");return;}printf("請輸入新的姓名:");scanf("%s", con->arr[find].name);printf("請輸入新的性別:");scanf("%s", con->arr[find].gender);printf("請輸入新的年齡:");scanf("%d", &con->arr[find].age);printf("請輸入新的電話:");scanf("%s", con->arr[find].tel);printf("請輸入新的住址:");scanf("%s", con->arr[find].addr);printf("修改成功!\n\n");
}

4.7 查找聯系人

????????調用FindByName函數,找到下標后打印對應的聯系人信息。

//查找通訊錄數據
void ContactFind(Contact* con)
{char name[NAME_MAX];printf("請輸入要查找的數據的姓名:");scanf("%s", name);int find = FindByName(con, name);if (find == -1){printf("要查找的數據的姓名不存在!!\n\n");return;}// 姓名  性別  年齡  電話  地址printf("找到了!!\n");printf("%5s %5s %5s %5s %5s\n", "姓名", "性別", "年齡", "電話", "地址");printf("%4s %5s %5d %5s %5s\n\n",con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}

5. 通訊錄保存到文件

5.1 保存函數和加載函數

? ? ? ? 注意,加載函數中的添加通訊錄數據是用的 SLPushBack() 函數。

//保存通訊錄
void ContactSave(Contact* con)
{FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("fopen");return;}// 將通訊錄數據寫入文件for (int i = 0; i < con->size; i++){// 此處用二進制寫入fwrite(con->arr + i, sizeof(peoInfo), 1, pf);printf("寫入第%d個數據\n", i + 1);}printf("通訊錄數據保存成功!\n");
}//加載通訊錄數據
void ContactLoad(Contact* con)
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("fopen");return;}peoInfo info;while (fread(&info, sizeof(peoInfo), 1, pf)){SLPushBack(con, info);}printf("歷史數據導入成功\n");
}

5.2 通訊錄初始化和銷毀函數修改

? ? ? ? 初始化需要讀取文件中的數據,銷毀前需要保存修改后的通訊錄數據。

//初始化通訊錄
void ContactInit(Contact* con)
{// 實際上要進行的是順序表的初始化// 順序表的初始化已經實現好了,直接調用即可SLInit(con);ContactLoad(con);  // 讀取文件中的通訊錄數據
}//銷毀通訊錄數據
void ContactDestroy(Contact* con)
{ContactSave(con);  // 保存修改后的通訊錄數據到文件中SLDestory(con);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92294.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MyBatis核心配置深度解析:從XML到映射的完整技術指南

&#x1f527; MyBatis核心配置深度解析&#xff1a;從XML到映射的完整技術指南 &#x1f680; 引言&#xff1a;MyBatis作為Java生態中最受歡迎的持久層框架之一&#xff0c;其強大的配置體系是實現靈活數據訪問的核心。本文將深入解析MyBatis的配置文件架構、映射機制以及高級…

OpenCV HSV與RGB顏色模型的區別

HSV與RGB顏色模型的區別 HSV&#xff08;Hue, Saturation, Value&#xff09;和 RGB&#xff08;Red, Green, Blue&#xff09;是兩種不同的顏色表示方式&#xff0c;主要區別如下&#xff1a;對比項RGBHSV定義基于紅、綠、藍三原色的混合基于色相&#xff08;H&#xff09;、飽…

具有柔性關節的機械臂matlab仿真

柔性關節機械臂MATLAB仿真方案&#xff0c;包含動力學建模、控制器設計和可視化分析。該方案基于拉格朗日方程建立柔性關節模型&#xff0c;并實現了PD控制、滑模控制和自適應控制三種控制策略。 MATLAB仿真 %% 柔性關節機械臂仿真 - 完整系統 % 作者: MATLAB技術助手 % 日期: …

數據結構—隊列和棧

1.二級指針的使用二級指針&#xff1a; 1. 在被調函數中&#xff0c;想要修改主調函數中的指針變量&#xff0c;需要傳遞該指針變量的地址&#xff0c;形參用二級指針接收。 2.指針數組的數組名是一個二級指針&#xff0c;指針數組的數組名作為參數傳遞時&#xff0c;可用二級指…

均線:從市場脈搏到量子計算的時空密碼

一部跨越百年的技術分析進化史,揭示金融市場的數學本質 引言:金融市場的永恒羅盤 在華爾街百年風云中,一個簡單的數學工具始終閃耀著智慧光芒——移動平均線(Moving Average)。從杰西利弗莫爾的手繪圖表到文藝復興科技的量子模型,均線系統完成了從經驗工具到科學框架的驚…

Python 通過Playwright+OpenCV破解滑動驗證碼 實例

由于公司最近需要對接某業務系統&#xff0c;涉及到部分數據需要提交至其它平臺業務系統&#xff0c;只有其它平臺賬戶&#xff0c;沒有接口&#xff0c;因此做此開發。首先通過OpenCV計算出驗證驗證碼滑塊距離&#xff0c;根據距離&#xff0c;使用 Playwright 利用滑動距離模…

山東省天地圖API申請并加載到QGIS和ArcGIS Pro中

目的&#xff1a;在QGIS/ArcGIS Pro中加載山東省不同時期的歷史影像1、申請API 山東省天地圖的API和國家天地圖的API不通用&#xff0c;需要單獨申請。 https://shandong.tianditu.gov.cn/ 打開本地服務資源找到影像的詳情頁 點擊申請地址按照下面的步驟一步一步來&#xff0c;…

qt窗口--02

文章目錄qt窗口--02QMessageBoxQColorDialogQFileDialogQFontDialogQInputDialog、結語很高興和大家見面&#xff0c;給生活加點impetus&#xff01;&#xff01;開啟今天的編程之路&#xff01;&#xff01; 作者&#xff1a;?( ‘ω’ )?260 我的專欄&#xff1a;qt&#…

Linux seLinux

Linux seLinux 1、什么是selinux&#xff0c;security enhanced linux–安全加強的linux。 是由美國國家安全局開發的以及歷史。selinux之前是基于自主存取控制方法DAC&#xff0c; 只要符合權限即可&#xff0c;通過suid和sgid特殊權限存在有一定的安全隱患&#xff0c; 甚至一…

Linux: NFS 服務部署與autofs自動掛載的配置

Linux&#xff1a; NFS 服務部署與autofs自動掛載的配置NFS&#xff08;Network File System&#xff0c;網絡文件系統&#xff09;是一種基于 TCP/IP 協議的網絡文件共享協議&#xff0c;允許不同主機在網絡中共享文件資源&#xff0c;實現跨主機的文件訪問與管理&#xff0c;…

【深度學習②】| DNN篇

0 序言 本文將系統介紹基于PyTorch的深度神經網絡&#xff08;DNN&#xff09;相關知識&#xff0c;包括張量的基礎操作、DNN的工作原理、實現流程&#xff0c;以及批量梯度下降、小批量梯度下降方法和手寫數字識別案例。通過學習&#xff0c;你將掌握DNN的核心概念、PyTorch實…

Xcode 26 如何在創建的 App 包中添加特定的目錄

功能需求 在某些情況下,我們需要將特定文件放在 Xcode 編譯鏈接后 App 包里的指定目錄中,比如將 AI 大模型相關文件放在它們對應名稱的目錄中: 正常情況下,Xcode 會將項目目錄中的所有文件都平鋪放到 App 包的根目錄里。那么,要如何形成上面這種文件目錄層級呢? 在本篇…

linux-系統性能監控

linux-系統性能監控一、cpu1.1 查看cpu的信息1.2 cpu性能指標1.3 編寫監控cpu使用率的腳本1.4 查找出使用cpu最高的10個進程二、內存2.1 查看內存信息2.2 交換&#xff08;swap&#xff09;分區2.2.1 查看交換分區的積極程度2.2.2 查看交換分區的大小2.2.3 管理交換分區2.3 編寫…

AgxOrin平臺JetPack5.x版本fix multi-cam race condition 補丁

本文包含三個針對NVIDIA Linux驅動程序的補丁修復: 多攝像頭競爭條件修復 在capture-ivc驅動中新增信號量機制,解決多攝像頭同時操作時的競爭條件問題(Bug 4425972)。主要修改包括在通道上下文結構中添加信號量,并在通道ID通知和取消注冊時進行信號量操作。 內存泄漏修復…

【Go】P3 Go語言程序結構

Go語言程序結構Go語言程序結構命名規則與編程慣例核心規則四種聲明語句詳解var聲明&#xff1a;變量聲明const聲明&#xff1a;常量聲明type聲明&#xff1a;類型定義func聲明&#xff1a;函數聲明簡短變量聲明(:)使用規則和限制指針&#xff1a;安全的內存地址操作基本概念和操…

【機器學習深度學習】知識蒸餾實戰:讓小模型擁有大模型的智慧

目錄 引言&#xff1a;模型壓縮的迫切需求 一、知識蒸餾的核心原理 1.1 教師-學生模式 1.2 軟目標&#xff1a;知識傳遞的關鍵 1.3 蒸餾損失函數 二、實戰&#xff1a;Qwen模型蒸餾實現 2.1 環境配置與模型加載 2.2 蒸餾損失函數實現 2.3 蒸餾訓練流程 2.4 訓練優化技…

基于MCP提示構建工作流程自動化的實踐指南

引言 在現代工作和生活中&#xff0c;我們經常被各種重復性任務所困擾——從每周的膳食計劃到代碼審查反饋&#xff0c;從文檔更新到報告生成。這些任務雖然不復雜&#xff0c;卻消耗了大量寶貴時間。MCP&#xff08;Model Context Protocol&#xff09;提示技術為解決這一問題…

apache-tomcat-11.0.9安裝及環境變量配置

一、安裝從官網上下載apache-tomcat-11.0.9,可以下載exe可執行文件版本&#xff0c;也可以下載zip版本&#xff0c;本文中下載的是zip版本。將下載的文件解壓到指定目錄&#xff1b;打開tomcat安裝目錄下“\conf\tomcat-users.xml”文件&#xff1b;輸入以下代碼&#xff0c;pa…

Java 大視界 -- Java 大數據機器學習模型在電商用戶生命周期價值評估與客戶關系精細化管理中的應用(383)

Java 大視界 -- Java 大數據機器學習模型在電商用戶生命周期價值評估與客戶關系精細化管理中的應用&#xff08;383&#xff09;引言&#xff1a;正文&#xff1a;一、電商用戶運營的 “糊涂賬”&#xff1a;不是所有客戶都該被討好1.1 運營者的 “三大錯覺”1.1.1 錯把 “過客…

豆包新模型與PromptPilot工具深度測評:AI應用開發的全流程突破

目錄引言一、豆包新模型技術解析1.1 豆包新模型介紹1.2 核心能力突破1.2.1 情感交互能力1.2.2 推理與編碼能力二、PromptPilot工具深度測評2.1 PromptPilot介紹2.2 工具架構與核心功能2.3 一個案例講通&#xff1a;市場調研報告2.3.1 生成Prompt2.3.2 批量集生成2.3.3 模擬數據…