線性表的鏈式存儲結構稱為鏈表。在鏈表的存儲中,每個結點不僅包含所存元素本身的信息,還包含元素之間邏輯關系的信息,即前驅結點包含后繼結點的地址信息,這樣就可以通過前驅結點中的地址信息方便地找到后繼結點的位置。
(1)鏈表不支持隨機訪問。
(2)鏈表的結點的存儲空間利用率較之順序表稍低一些。
(3)鏈表支持存儲空間的動態分配。
(4)在鏈表中進行插入操作無需移動元素。
typedef struct Node{ int data; struct Node *next;}Node;4.單鏈表實現增刪查
頭插法圖:

實現:
#include<stdio.h>#include<stdlib.h>typedef struct Node{ int data; struct Node *next;}Node;//頭插法創建鏈表Node *createListByHead(Node *A){ int length,i,x; Node *p,*s; A=(Node *)malloc(sizeof(Node)); if(A ==NULL){ PRintf("ERROR"); exit(0); } A->next=NULL; p=A; scanf("%d", &length); for(i=0;i<length;i++){ scanf("%d", &x); s=(Node *)malloc(sizeof(Node)); if(s ==NULL){ printf("ERROR"); exit(0); } s->data=x; s->next=p->next; p->next=s; } return A;}//尾插法創建鏈表Node *createListByTail(Node *B){ int length,i,x; Node *p,*q; B=(Node *)malloc(sizeof(Node)); if(B==NULL){ printf("ERROR"); } B->next=NULL; p=B; scanf("%d",&length); for(i=0;i<length;i++){ scanf("%d",&x); q=(Node *)malloc(sizeof(Node)); q->data=x; p->next=q; p=p->next; } p->next=NULL; return B;}//查詢輸入值是否在鏈表中int findVal(Node *C,int x){ Node *p=C->next; while(p !=NULL){ if(p->data==x){ return 1; } p=p->next; } return 0;}//刪除單鏈表結點int deleteList(Node *A,int x){ Node *p=A; Node *q; if(findVal(A,x)==0){ return 0; } while(p !=NULL){ if(p->next->data==x){ q=p->next; p->next=q->next; free(q); return 1; } p=p->next; } return 0;}//打印鏈表所有值void printList(Node *A){ Node *p=A->next; printf("打印鏈表結果:/n"); while(p !=NULL){ printf("%d ",p->data); p=p->next; } printf("/n");}void main(){ Node *A,*B; int x; //B=createListByHead(A); B=createListByTail(A); printList(B); printf("刪除值:/n"); scanf("%d",&x); deleteList(B,x); printList(B); //printf("%d",findVal(B,x));}結果:
新聞熱點
疑難解答