1. 程式人生 > >資料結構-線性表-單鏈表

資料結構-線性表-單鏈表

單鏈表定義

單鏈表:具有指向下一個節點的結構體.

功能描述

  • 建立新連結串列
  • 獲取長度
  • 按索引查詢
  • 按值查詢
  • 刪除某節點
  • 更改某結點值
  • 向後新增一個結點
  • 顯示所有結點內容

程式碼實現

#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; }