數(shù)據(jù)結(jié)構(gòu)中的鏈?zhǔn)酱鎯?/p>
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比玉樹網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式玉樹網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋玉樹地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。一,概念
程序中存儲多個數(shù)據(jù)時,數(shù)據(jù)與數(shù)據(jù)之間的存儲不?定是連續(xù)的,數(shù)據(jù)元素 的存儲位置可以是任意的,隨機(jī)的。不能像之前的順序存儲?樣,可以使? 地址來表?先后。鏈?zhǔn)酱鎯筒?,不能?地址的先后來表?。
鏈?zhǔn)酱鎯Γ捍鎯?數(shù)據(jù)+關(guān)系
數(shù)據(jù)元素:? ?
數(shù)據(jù)(前一個元素的地址) | 關(guān)系(后一個元素的地址) |
? 即在存儲數(shù)據(jù)的同時也存儲數(shù)據(jù)的關(guān)系,用來表示數(shù)據(jù)間的先后關(guān)系。
二,單向列表
?概念: 在使用有先后關(guān)系的鏈?zhǔn)酱鎯r,在存儲關(guān)系時只存儲后一個元素的地址就能知道元素的值。
?????????????????????????鏈表元素(圖形表示):? ?
????????????????????? | next(下一個元素的地址) |
鏈表元素(代碼表示):
struct node
{
?????xxx data;
????? struct node * next;
};?
鏈表概念
1. 頭指針:是?個指針,存儲鏈表中第0個元素的地址(永遠(yuǎn)表?鏈表的 開始);便于說明鏈表的位置,?便后期找到鏈表
2. 節(jié)點(diǎn):鏈表中的?個元素就叫做?個節(jié)點(diǎn) 頭節(jié)點(diǎn):在鏈表中通常會加??個不存儲任何數(shù)據(jù)的空節(jié)點(diǎn),作為鏈表 的第0個元素,作?是之后?便操作鏈表。
鏈表的運(yùn)算
創(chuàng)建鏈表
? 執(zhí)行鏈表的運(yùn)算首先就得創(chuàng)建一個鏈表
//類型聲明
#include//類型聲明
struct node
{
int data;
struct node * next;
};
//創(chuàng)建一個鏈表
struct node * create()
{
//創(chuàng)建一個空節(jié)點(diǎn),頭節(jié)點(diǎn)不存儲任何數(shù)據(jù)相當(dāng)于空節(jié)點(diǎn)
struct node * p = malloc(sizeof(struct node)); //申請一個結(jié)構(gòu)體作為空節(jié)點(diǎn)。
if(p == NULL)
{
printf("malloc error\n");
return NULL;
}
//頭節(jié)點(diǎn)不存儲任何數(shù)據(jù),所以p->next是沒有數(shù)據(jù)的。
p->next = NULL;
return p;
}
? 1,?鏈表元素插?
? 要插入一個數(shù)據(jù)元素,就是把要插入位置的數(shù)據(jù)元素向后移動然后插入需要插入的數(shù)據(jù)元素。即先移位后插入
void insert(struct node * head,int pos,int data) //head;頭指針,頭節(jié)點(diǎn)的地址
{
struct node * p = head;//p也是頭節(jié)點(diǎn)的地址
int i = 0;//當(dāng)前有0個
//找到待插入的前一個元素的地址
while(p->next != NULL && i< pos-1)//條件就是i == pos前一個 pos作為元素地址下標(biāo)
{
p = p->next;//p
i++;
}
//p;就是要插入位置的前一個
//創(chuàng)建新節(jié)點(diǎn)
struct node * q = malloc(sizeof(struct node));
q->data = data;
//插入數(shù)據(jù)元素
q->next = p->next;
p->next = q;
}
//函數(shù)調(diào)用
int main()
{
struct node * head = create();
insert(head,插入位置的地址下標(biāo),10);
}
? 2,?刪除元素
? 要刪除數(shù)據(jù)元素首先要確定數(shù)據(jù)元素是否為空。
//刪除數(shù)據(jù)元素
int empty(struct node * head) //要刪除數(shù)據(jù)元素首先要判斷數(shù)據(jù)元素是否存在。
{
if(head->next == NULL)
{
printf("is empty\n"); //如果數(shù)據(jù)元素不存在就返回為1
return 1;
}
else
return 0; //如果數(shù)據(jù)元素存在就返回0
}
//執(zhí)行數(shù)據(jù)的刪除
void del(struct node * head,int data)
{
struct node * p = head; //head和p都作為頭節(jié)點(diǎn)
if( empty(head) )
{
return ; //數(shù)據(jù)元素不為空就執(zhí)行操作
}
while(p->next != NULL)
{
if(p->next->data == data) //找到要刪除的數(shù)據(jù)元素。
{
struct node * q = p->next;//q就是要刪除的數(shù)據(jù)元素的地址下標(biāo)
p->next = q->next;
printf("del is %d\n",q->data);
free(q); //申請的空間需要得到釋放
break;
}
p = p->next;
}
}
//函數(shù)調(diào)用
int main()
{
struct node * head = create();
del(head,數(shù)據(jù)元素下標(biāo));
}
? 3,查找:
//判斷數(shù)據(jù)元素是否存在
int empty(struct node * head)
{
if(head->next == NULL)
{
printf("is empty\n"); //如果數(shù)據(jù)元素不存在就返回為1
return 1;
}
else
return 0; //如果數(shù)據(jù)元素存在就返回0
}
//查找數(shù)據(jù)元素
void search(struct node * head,int data)
{
if( empty(head) ) //首先也的判斷數(shù)據(jù)元素是否為空。
{
return ; //數(shù)據(jù)元素不為空就執(zhí)行操作
}
struct node * p = head;
while(p->next != NULL)
{
p = p->next;
if( p->data == data )
{
printf("find data %d\n",data);
return ;
}
}
}
//函數(shù)調(diào)用
int main()
{
struct node * head = create();
search(head,需要查找的數(shù)據(jù)元素下標(biāo));
}
4,修改
? 需要修改一個數(shù)據(jù)元素首先就要找打這個數(shù)據(jù)元素。
//修改數(shù)據(jù)元素
void update(struct node * head,int src,int dest)
{
struct node * p = head;
while(p->next != NULL) //要修改數(shù)據(jù)元素首先要找到這個數(shù)據(jù)元素然后再執(zhí)行操作。
{
p = p->next;
if( p->data == src )
{
p->data = dest; //找到數(shù)據(jù)元素執(zhí)行修改。
printf("update ok\n");
return ;
}
}
}
//函數(shù)調(diào)用
int main()
{
struct node * head = create();
update(head,需要被修改的元素的地址下標(biāo),修改后的數(shù)據(jù)元素);
}
? 5,顯示所有的數(shù)據(jù)元素
//顯示所有的數(shù)據(jù)元素
void show(struct node * head)
{
struct node * p = head;
//struct node * p = head->next; p != NULL
while(p->next != NULL) //當(dāng)數(shù)據(jù)元素為空就停止訪問
{
p = p->next;
printf("%d ",p->data);
}
printf("\n");
}
//函數(shù)調(diào)用
int main()
{
struct node * head = create();
show(head);
}
單向循環(huán)鏈表: 整個數(shù)據(jù)的最后一個元素不在是空(NULL)而是指向頭指針,存儲head。
即:P->NULL改為p->head.
? 雙向鏈表:數(shù)據(jù)的關(guān)系不再是只存儲后一個元素的地址,而是存儲前一個和后一個的地址。
數(shù)據(jù)元素(圖形說明):
數(shù)據(jù) | 關(guān)系 prior(前一個元素的地址) | 關(guān)系next(后一個元素的地址) |
數(shù)據(jù)元素(代碼說明):
? struct? node
?????????????{
? xxx data;
? struct? *prior(前一個元素的地址)
? struct? *next(后一個元素的地址);
??????????????};
在創(chuàng)建鏈表時,只需要在單向列表的基礎(chǔ)上加上? p->prior==NULL即可。
在修改鏈表數(shù)據(jù)時:
q->prior = p;
? q->next = p->next;
p->next = q;
? q->next->prior = q;
在刪除鏈表數(shù)據(jù)元素時:
? q = p->next;
? p->next = q->next;
? q->next->prior = p;
? free(q);
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧