天天看點

連結清單(入門)

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

繼續閱讀