1.資料的儲存的方法有:數組和連結清單;
連結清單對于數組的優化有:<1.>不用開始時就精确的制定所需記憶體單元的大小;
<2>.對數組中的元素進行增、删、改時特别不友善;
但連結清單也有它的不足:由于它不是在記憶體單元上連續存儲的,是以連結清單中的資料查詢起來沒 有數組那麼簡單。
連結清單(單連結清單): 0024 0004 0008 NULL(指針域)
結點: 丙 · 乙 甲 丁 (資料域)
存儲位置: 0004 0008 0016 0024
* 指針域和資料域是結點所要存儲的資料,資料按甲、乙、丙、丁的順序排列,存儲甲的結點需要儲存甲自身的資料域和乙的指針域,乙、丙也相同,而丁作為最後一個元素,儲存的指針域便是一個空指針;
* 連結清單中各元素類型一緻。
2.連結清單分類:
單連結清單:指針域隻有一個的連結清單;(資料域+後繼元素位址)
雙連結清單:指針域有兩個的連結清單;(前一進制素位址+資料域+後繼元素位址)
循環連結清單:最後一個元素的指針域非空且為首元素位址。
3.連結清單組成:
頭指針(唯一确定單連結清單)+頭結點(可有可無)+首元結點......+尾結點
4.單連結清單存儲資料:
存儲學生資訊
1.不常用
typedef struct student
{
char num; //存儲學号
char name; //存儲姓名
int score; //´存儲成績
struct Linklist * next; //建立指針域
}Lnode,Linklist;
2.常用
typedef struct
{
char num; //存儲學号
char name; //存儲姓名
int score; //´存儲成績
}Elemtype;
typedef struct Node
{
Elemtype data;
struct Linklist * next; //建立指針域
}Node,Linklist;
5.單連結清單的建構
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;//儲存結點資料
struct node*next;//儲存下一結點位址
};//注意結構體建立有分号
int main(void)
{
struct node * head,* p,* q,* t;
int i,n,a;
scanf("%d",&n);//資料元素個數
head = NULL;//頭指針初始為空
for(i=0;i<n;i++)
{
scanf("%d",&a);//輸入n個資料
p=(struct node *)malloc(struct node);//動态申請一個空間用來存放結點
p->data = a;
p->next = NULL;
if(head==NULL)//頭結點
head=p;
else//非頭結點
q->next = p;
q = p;
}
t = head;
while(head!=NULL)
printf("%d',t->data);
t=t->next;
}
6.連結清單的插入
原理:首先由頭指針開始周遊個結點,找到合适的位置後插入
scanf("%d",&a);//要插入的數
t = head;//由原連結清單頭指針開始周遊
while(t!=NULL)//循環條件
{
if(t->next->data>a)
{
p=(struct node*)malloc(sizeof(struct node));
p->data=a;
p->next=t->next;
t=p->next;
break;
}
t=t->next;
}
7.連結清單中第m個資料的查找
int m,j=0;
scanf("%d",&m);
t = head;
while(t!=NULL)
{
++j;//計數器
if(j==m)
{
printf("%d",t->data);
}
t=t->next;
}
}