數(shù)組:方便訪問,不方便插入刪除
鏈表:不必連續(xù),定義鏈表,節(jié)點定義,結構體構造,生成鏈表和動態(tài)機制,進行鏈表的三個操作(增刪改)
(1)鏈表概述
鏈表是一種數(shù)據(jù)結構,它采用動態(tài)分配存儲單元方式。它能夠有效地節(jié)省存儲空間(同數(shù)組比較)。
鏈表都有一個“頭指針”變量(head),它用于指向鏈表中第一個元素(即用于存放鏈表中第一個元素的地址)。鏈表中的元素稱為“結點”,鏈表中的所有結點都是結構體類型,且同一結點都是同一結構體類型。每個結點都應包括數(shù)據(jù)部分和下個節(jié)點的地址兩部分內容。鏈表的最后一個元素(結點)稱為鏈尾,它不再指向其他結點(即該結點的指針成員值為NULL)。
鏈表的訪問都是通過指針變量從頭結點開始。
由于鏈表中的節(jié)點是一個結構體類型,并且節(jié)點中有一個成員用于指向下一個結點。所以定義作為結點的格式:
struct 結構體名
{定義數(shù)據(jù)成員;
struct 結構體名*指針變量名;
};
例如:
struct student
{int num;float score;
struct student *next;
};
struct student a,*p;
//出現(xiàn)指向自身的指針是鏈表中的節(jié)點
(2)動態(tài)存儲分配函數(shù)<stdlib.h>
1.malloc()函數(shù)
格式:malloc(size)
malloc()返回值是void類型,必須進行強制類型轉換?。。?br>
作用是在內存的動態(tài)存儲區(qū)中分配一個長度為size個字節(jié)的連續(xù)空間
,函數(shù)返回值為一個指向分配域起始地址的指針若分配失敗則返回NULL。
例如:開辟一個用于存放struct student數(shù)據(jù)的內存空間,并讓p指向該空間:
struct student*p=(struct student*)malloc(sizeof(struct student
2.free()函數(shù)
格式:free(p);
作用是釋放用malloc()分配的內存。
3.鏈表操作
(1)建立動態(tài)鏈表(假定若輸入的成員為0則表示結束)
#include<stdlib.h>
struct node{
int data;
struct node *next;
};
int main() {
struct node *head,*p=(struct node *)malloc(sizeof(struct node)),*q=(struct node *)malloc(sizeof(struct node));
p->data=10;
head=p;
q->data=20;
q->next=NULL;
p->next=q;
return 0;
}
(2)訪問鏈表
求平均數(shù)
struct node{
int data;
struct node *next;
};
struct node *head,*p=(struct node *)malloc(sizeof(struct node));
int sum=0;
p=head;
while(p!=NULL)
{sum+=p->data;
p=p->next;
}
sum/=3;//隨便敲der
(3)鏈表結點的刪除
如:
a、請將結點b從鏈表中刪除。
b、請將結點d從鏈表中刪除。
c、請將結點a從鏈表中刪除并讓head重新指向鏈表的第一個結點。
刪除中間節(jié)點:必須要拿到要刪除的節(jié)點的錢一個節(jié)點的地址
q->next=p->next;free(p);
p=q->next;q->next=q->next->next;free(p);
刪除頭節(jié)點:p=head;head=head->next;free(p);
刪除尾節(jié)點:知道尾節(jié)點前一個節(jié)點q
p=q->next;q->next=NULL;free(p)
(4)增加結點
如:
a、請將結點c插入結點之間,形成新鏈表
b、請將結點c插到已有鏈表的末尾
c、請將結點c插到已有鏈表的前面
在中間插入節(jié)點q后插入s:先連后改指向,s->next=q->next;q->next=s;
在頭部插入節(jié)點s:s->next=head;head=s;
尾部s:s->next=NULL;q->next=s;