資料結構-線性表-單鏈表
阿新 • • 發佈:2018-11-27
單鏈表定義
單鏈表:具有指向下一個節點的結構體.
功能描述
- 建立新連結串列
- 獲取長度
- 按索引查詢
- 按值查詢
- 刪除某節點
- 更改某結點值
- 向後新增一個結點
- 顯示所有結點內容
程式碼實現
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int num;
LNode * next;
};
//建立連結串列
LNode * creatLNode(){
LNode * lNode=(LNode *)malloc(sizeof(LNode));
lNode->next =NULL;
return lNode;
}
//獲取長度
int lengthLNode(LNode *L){
int i=0;
LNode *lNode=L;
while(lNode->next!=NULL){
lNode=lNode->next;
i++;
}
return i+1;//之所以+1,因為指標指向最後一個元素,但i沒用自增,故+1
}
int getLenth(LNode *L){
int length=0;
LNode *p=L;
while (p){
p=p->next ;
length++;
}
return length;
}
//向後新增一個結點
bool addLnode(LNode * L,int num){
LNode * last=L;
LNode * lnode=(LNode *)malloc(sizeof(LNode));
lnode->num=num;
lnode->next=NULL;
while (last->next!=NULL){
last=last->next;
}
last->next=lnode;
return true;
}
//查詢 通過索引值
LNode * findNodeByIndex(LNode *L,int index){
LNode *p=L;
int i=0;
while (p!=NULL&&i<index){
p=p->next;
i++;
}
if(i==index)return p;
else return NULL;
}
//查詢 通過值
LNode *findLNodeByValue(LNode *L,int value){
LNode *p=L;
while(p){
if(p->num==value){
return p;
}
p=p->next;
}
return NULL;
}
LNode * findLNodeByV2(LNode *L, int value){
LNode *p=L;
while (p!=NULL&&p->num!=value){
p=p->next;
}
return p;
}
//插入 索引值為插入結點
//存在插入頭結點的情況,故以返回值形式的函式
LNode* insert(LNode *L,int index,int num){
LNode* p;
LNode *newL=(LNode *)malloc(sizeof(LNode));
newL->num=num;
if (index==0){
newL->next=L;
return newL;
}
//獲取前結點
p=findNodeByIndex(L,index-1);
//判斷是否為空
if (p=NULL){
return NULL;
}
//進行插入操作
newL->next=p->next;
p->next=newL;
return L;
}
//修改某節點值
bool changeValueByIndex(LNode *L,int index, int value){
if (index<0||index>getLenth(L)){
return false;
}
LNode * p=findNodeByIndex(L,index);
p->num=value;
return true;
}
//刪除某結點 存在刪除頭結點,故用函式返回值方式返回連結串列
LNode * delNodeByIndex(LNode *L,int index){
if (index==0){
LNode *p=L;
p=p->next;
free(L);
return p;
}
LNode * p1=findNodeByIndex(L,index-1);
if (p1==NULL||p1->next==NULL){
return NULL;
}
LNode *p2=p1->next;
p1->next=p2->next;
free(p2);
return L;
}
//顯示所有節點內容
void showAllLNode(LNode *L){
LNode * lNode=L;
while(lNode){
printf("%d\t",lNode->num);
lNode=lNode->next;
}
printf("\n");
}
int main(){
LNode *lNode=creatLNode();
for (int i = 0; i <10 ; i++) {
addLnode(lNode,i);
}
LNode *head=findNodeByIndex(lNode,0);
changeValueByIndex(lNode,0,-1);
lNode=delNodeByIndex(lNode,5);
showAllLNode(lNode);
return 0;
}