網站首頁 編程語言 正文
存儲結構
typedef int dataType;//愛護據類型
typedef struct Node {
DataType data; // 結點數據
struct Node *next; // 指向下一個結點的指針
} Node, *LinkList;
基本功能
- 頭插法創(chuàng)建單鏈表void CreateListHead( LinkList &head)
- 尾插法創(chuàng)建單鏈表void CreateListTail( LinkList &head)
- 獲取指定位置的元素 int GetElement(LinkList head, int i, DataType &e)
- 獲取指定元素的位置 int LocateElement(LinkList head, int e)
- 在指定位置插入元素 int InsertList(LinkList head, int i, DataType e)
- 刪除指定位置的元素 int DeleteList(LinkList head, int i, DataType &e)
- 獲取單鏈表的長度 int LengthLinkList(LinkList head)
- 合并兩個非遞減的單鏈表 void MergeList(LinkList La, LinkList Lb, LinkList &Lc)
- 寂鏈表void Destroy( LinkList &L)
- 遍歷打印單鏈表中的所有元素 void PrintList(LinkList head)
頭插法創(chuàng)建單鏈表
每次添加鏈的結點都能找到頭結點的第1號位置,所以創(chuàng)建單表中的元素的順序是輸入元素的逆序。??
/**
* 頭插法創(chuàng)建單鏈表,輸入以-1結束
*/
void CreateListHead(LinkList &head) {
DataType x;
LinkList p;
head = (LinkList)malloc(LEN);
head->next = NULL;
scanf("%d", &x);
while (x != -1) {
p = (LinkList)malloc(LEN);
p->data = x;
p->next = head->next; // 新增的結點指向頭結點的下一個結點
head->next = p; // 頭結點指向新增的結點
scanf("%d", &x);
}
}
尾插法創(chuàng)建單鏈表
每次新增的結點都放在單鏈表的后面,接下來和接下來的順序保持一致。??
/**
* 尾插法創(chuàng)建單鏈表,輸入以-1結束
*/
void CreateListTail(LinkList &head) {
LinkList p, q;
DataType x;
head = (LinkList)malloc(LEN);
q = head;
scanf("%d", &x);
while (x != -1) {
p = (LinkList)malloc(LEN);
p->data = x;
q->next = p;
q = p;
scanf("%d", &x);
}
q->next = NULL;
}
獲取指定位置的元素
/**
* 獲取指定位置的元素
* @param head 指向單鏈表頭結點的指針(頭指針)
* @param i 位置
* @param e 用來存放對應位置的元素值
* @return 0:獲取失敗;1:獲取成功
*/
int GetElement(LinkList head, int i, DataType &e) {
LinkList p = head->next;
int j = 1;
while (p && j < i) { // 依次后移,直至為空或到達位置
p = p->next;
j++;
}
if (!p || j > i) { // p為空表示位置超過最大位置,j > i表示位置不合法(i < 1)
return 0;
}
e = p->data;
return 1;
}
在指定位置插入元素
/**
* 在單鏈表插入元素到位置i
* @param head 單鏈表的頭指針
* @param i 插入位置
* @param e 插入元素
* @return 1:插入成功,0:插入失敗
*/
int InsertList(LinkList head, int i, DataType e) {
LinkList p = head; // 從頭結點開始
int j = 1;
while (p && j < i) { // 找到插入位置的前一個結點
p = p->next;
j++;
}
if (!p || j > i) { // p為空或i < 1,插入位置不合法
return 0;
}
LinkList q = (LinkList)malloc(LEN); // 創(chuàng)建新結點
q->data = e;
q->next = p->next; // 將新結點指向前一個結點的后一個結點
p->next = q; // 前一個結點指向新結點
// 執(zhí)行上述兩個操作后,達到的效果是新結點插入到了前一個結點的后面
}
刪除指定位置的元素
/**
* 刪除指定位置的元素
* @param head
* @param i 位置
* @param e 被刪除的元素的值存放在e中
* @return 1:刪除成功,0:刪除失敗
*/
int DeleteList(LinkList head, int i, DataType &e) {
LinkList p = head;
int j = 1;
while (p && j < i) { // 找到位置的前一個結點
p = p->next;
j++;
}
if (!p || j > i) {
return 0;
}
LinkList s = p->next;
e = s->data;
p->next = s->next; // 改變前一個結點的指向,使其指向刪除結點的后一個結點
free(s);
return 1;
}
獲取單鏈表的長度
/**
* 獲取單鏈表的長度
* @param head
* @return 單鏈表的長度
*/
int LengthLinkList(LinkList head) {
LinkList p = head->next;
int count = 0;
while (p) {
count++;
p = p->next;
}
return count;
}
合并兩個非遞減的單鏈表
合并兩個非遞減的單鏈,新鏈表仍然保持非遞減。??
/**
* 合并兩個非遞減的單鏈表,新的鏈表仍然非遞減
* @param La
* @param Lb
* @param Lc
*/
void MergeList(LinkList La, LinkList Lb, LinkList &Lc) {
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
pc = Lc = (LinkList)malloc(LEN);
while (pa && pb) {
if (pa->data <= pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
} else {
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
free(Lb);
}
晴鏈表
/**
* 銷毀鏈表
*/
void Destroy(LinkList &L) {
LinkList p, q;
p = L;
while (p) { // 遍歷所有結點,釋放內存
q = p;
p = p->next;
free(q);
}
L = NULL; // L置為NULL
}
遍歷打印單鏈表
/**
* 遍歷打印單鏈表的所有元素
*/
void PrintList(LinkList head) {
LinkList p = head->next;
if (p == NULL) {
cout << "List is NULL!" <<endl;
} else {
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
附上完整代碼
#include<cstdlib>
using namespace std;
#define LEN sizeof(Node)
typedef int DataType;
typedef struct Node {
DataType data;
struct Node *next;
} Node, *LinkList;
/**
* 頭插法創(chuàng)建單鏈表
* @param head
*/
void CreateListHead(LinkList &head) {
DataType x;
LinkList p;
head = (LinkList)malloc(LEN);
head->next = NULL;
scanf("%d", &x);
while (x != -1) {
p = (LinkList)malloc(LEN);
p->data = x;
p->next = head->next;
head->next = p;
scanf("%d", &x);
}
}
/**
* 尾插法創(chuàng)建單鏈表
* @param head
*/
void CreateListTail(LinkList &head) {
LinkList p, q;
DataType x;
head = (LinkList)malloc(LEN);
q = head;
scanf("%d", &x);
while (x != -1) {
p = (LinkList)malloc(LEN);
p->data = x;
q->next = p;
q = p;
scanf("%d", &x);
}
q->next = NULL;
}
/**
* 獲取指定位置的元素
* @param head 單鏈表頭指針
* @param i 位置
* @param e 獲取的元素賦值該參數
* @return 0:獲取失敗;1:獲取成功
*/
int GetElement(LinkList head, int i, DataType &e) {
LinkList p = head->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) {
return 0;
}
e = p->data;
return 1;
}
/**
* 獲取某個元素的位置
* @param head
* @param e
* @return 元素的位置
*/
int LocateElement(LinkList head, int e) {
LinkList p = head->next;
int j = 1;
while (p && p->data != e) {
p = p->next;
j++;
}
if (!p) {
return 0;
}
return j;
}
/**
* 在單鏈表插入元素到位置i
* @param head 單鏈表的頭指針
* @param i 插入位置
* @param e 插入元素
* @return 1:插入成功,0:插入失敗
*/
int InsertList(LinkList head, int i, DataType e) {
LinkList p = head;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) {
return 0;
}
LinkList q = (LinkList)malloc(LEN);
q->data = e;
q->next = p->next;
p->next = q;
}
/**
* 刪除指定位置的元素
* @param head
* @param i 位置
* @param e 被刪除的元素的值存放在e中
* @return 1:刪除成功,0:刪除失敗
*/
int DeleteList(LinkList head, int i, DataType &e) {
LinkList p = head;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) {
return 0;
}
LinkList s = p->next;
e = s->data;
p->next = s->next;
free(s);
return 1;
}
/**
* 獲取單鏈表的長度
* @param head
* @return
*/
int LengthLinkList(LinkList head) {
LinkList p = head->next;
int count = 0;
while (p) {
count++;
p = p->next;
}
return count;
}
/**
* 合并兩個非遞減的單鏈表,新的鏈表仍然非遞減
* @param La
* @param Lb
* @param Lc
*/
void MergeList(LinkList La, LinkList Lb, LinkList &Lc) {
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
pc = Lc = (LinkList)malloc(LEN);
while (pa && pb) {
if (pa->data <= pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
} else {
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
free(Lb);
}
/**
* 銷毀鏈表
* @param L
*/
void Destroy(LinkList &L) {
LinkList p, q;
p = L;
while (p) {
q = p;
p = p->next;
free(q);
}
L = NULL;
}
/**
* 遍歷打印單鏈表的所有元素
* @param head
*/
void PrintList(LinkList head) {
LinkList p = head->next;
if (p == NULL) {
cout << "List is NULL!" <<endl;
} else {
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
int main() {
LinkList L;
printf("頭插法創(chuàng)建單鏈表:(輸入以-1結束)\n");
CreateListHead(L);
PrintList(L);
printf("尾插法創(chuàng)建單鏈表:(輸入以-1結束)\n");
CreateListTail(L);
PrintList(L);
InsertList(L, 1, 100);
printf("在1號位置插入100后,單鏈表如下:\n");
PrintList(L);
DataType e;
DeleteList(L, 1, e);
printf("刪除1號位置的元素,被刪除的元素為:\n");
printf("刪除后的單鏈表為:\n");
PrintList(L);
printf("單鏈表的長度為:%d\n", LengthLinkList(L));
GetElement(L, 1, e);
printf("1號位置的元素為:%d\n");
printf("元素4在單鏈表中的位置為:%d\n", LocateElement(L, 4));
cout << endl;
LinkList La, Lb, Lc;
printf("尾插法創(chuàng)建單鏈表La:\n");
CreateListTail(La);
PrintList(La);
printf("尾插法創(chuàng)建單鏈表Lb:\n");
CreateListTail(Lb);
PrintList(Lb);
MergeList(La, Lb, Lc);
printf("合并單鏈表La和Lb后的新單鏈表Lc如下:\n");
PrintList(Lc);
return 0;
}
運行結果:?
?注意:
寫法采用了C++引用參數的寫法,LinkList &head,C語言下不支持這種寫法,需要在C++環(huán)境下使用,即.cpp文件。
下面附上C語言的:
/**
* LinkList 本身已經是結構體指針,參數再使用LinkList *的形式
* 可以理解為要想改變一個結構體指針,則需要取指針的指針。
* 類似于改變int a,則需要使用 int *a,這里要改變LinkList head,則需要使用LinkList *head
*/
void CreatListTail(LinkList *head) {
int x;
LinkList *p, *q;
*head = (LinkList *) malloc(LEN);
q = *head;
scanf("%d", &x);
while (x != -1) {
p = (LinkList *) malloc(LEN);
p->data = x;
q->next = p;
q = p;
scanf("%d", &x);
}
q->next = NULL;
}
// 可以不傳參,函數里面定義頭指針,創(chuàng)建鏈表,然后把頭指針返回,主函數用結構體指針接收即可
LinkList CreateListhead() {
int x;
LinkList *head, *p;
head = (LinkList *) malloc(LEN);
head->next = NULL;
scanf("%d", &x);
while (x != -1) {
p = (LinkList *) malloc(LEN);
p->data = x;
p->next = head->next;
head->next = p;
}
return head;
}
原文鏈接:https://juejin.cn/post/7091839297757642788
相關推薦
- 2022-04-04 react解包并配置Less解包config文件目錄
- 2022-04-25 C#使用NPOI設置Excel下拉選項_C#教程
- 2022-03-15 azkaban.utils.UndefinedPropertyException: Missing
- 2022-09-24 python實現梯度下降求解邏輯回歸_python
- 2022-08-02 pyspark自定義UDAF函數調用報錯問題解決_python
- 2022-05-28 C語言?超詳細講解庫函數_C 語言
- 2023-01-21 python?flask自定義404錯誤頁面方式_python
- 2022-03-29 python實現二叉排序樹_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支