在儲存結構上,不需要連續的儲存空間,需要上乙個結點的指標域 指向下乙個結點即可,找到乙個結點就可以找到下乙個結點。
下面看**:
結果驗證截圖:#include #include #define error 0
#define ok 1
typedef int eletype;
typedef int status;
typedef struct node node;
//鍊錶元素
struct node
;typedef node* linklist;
void printlinklist(const linklist * const list)
int i = 1;
linklist li = (*list)->next;//從頭結點後面第乙個結點開始遍歷
while (li)//最後乙個元素沒有指向,不會進行迴圈。
printf("\n");
return;
}//建立擁有頭結點的鍊錶
//頭插法建立鍊錶,往煉表中新增元素,新建立的的元素始終在頭結點後面類似 頭指標 -> 頭結點->an->an-1->an-2 ...-> a1
//元素的資料 隨機生成100以內的數字
status creatlinklistinhead(linklist *list,int n)
li->next = null;//初始頭結點沒有指向
for ( i = 0; i < n; i++)
node->data = rand()%100;//除以100取餘的到100以內的數字,不包括100,如果含100 就需要+1
node->next = li->next;//新新增的元素指標域 指向頭結點後面的結點
li->next = node;//頭結點指標域 指向新增加的元素
} *list = li;//通過指標 給外部鏈結串列賦值
return ok;
}//尾插法建立鍊錶,往煉表中新增元素,先新增的元素放前面,後新增的元素放後面,遵循先來後到的道理
status creatlinklistintail(linklist *list, int n)
li->next = null;//初始頭結點指向
*list = li;//給通過外部鏈結串列賦值,指向頭結點,此時 list 和 li 都指向頭結點。
for ( i = 0; i < n; i++)
node->data = rand() % 100;//除以100取餘的到100以內的數字,不包括100,如果含100 就需要+1
li->next = node;//新結點 放到鍊錶末尾
li = node;//移動鍊錶指標指向最新鍊錶最後乙個元素,為了下次迴圈在鍊錶末尾新增元素
//temp = node;
} //最後表尾元素指標域 設定null
li->next = null;
//*list = li;//一定要放在for迴圈前面,不然頭結點的記憶體空間沒有指向!起初l指向頭結點,但是進入for迴圈後l的指向發生改變要移動指向最新新增的結點元素。
return ok;
}//獲取鍊錶元素資料,通過指標返回 鍊錶第i個元素的 資料
//i還是按國人的順序來吧,從1開始
status getelement(linklist list, int position,eletype *e)
linklist li = list;
int i = 1;
while (li && inext;
} if (null == li || position > i)
//通上面 while迴圈 當i = position 跳出迴圈 ,li 此時指向鍊錶 第position位置的 前面乙個結點。
*e = li->next->data;
return ok;
}//往煉表中第position位置 插入元素,元素資料為 e
//元素位置從1開始數
status insertlinklist(linklist *list,int position,eletype e)
linklist li = * list;
int i = 1;
while ( li && inext;
} if (null == li || position > i)
//通上面 while迴圈 當i = position 跳出迴圈 ,li 此時指向鍊錶 第position位置的 前面乙個結點。
node->data = e;
node->next = li->next;//讓 插入結點指標域指向 原來位置的結點
li->next = node;//讓插入結點位置前的結點 指向插入結點
return ok;
}//在鍊錶第position位置 刪除元素,通過指標返回 刪除元素的資料內容
status dellinklistele(linklist *list, int position, eletype *e)
linklist li = *list;
node * node = null;
int i = 1;
while (li && inext;
} if (null == li || position > i)
//通上面 while迴圈 當i = position 跳出迴圈 ,li 此時指向鍊錶 第position位置的 前面乙個結點。
node = li->next;//儲存要刪除元素的位址
li->next = node->next;//讓刪除元素前置結點 指向 刪除元素 直接後繼結點。然後就可以釋放 刪除結點的空間了。
*e = node->data;//將刪除元素資料通過指標修改返回
free(node);//釋放刪除元素空間
return ok;
}//清空整個鍊錶,釋放指標指向的記憶體
status freelinklist(linklist *list)
//將頭結點指標域設定為null
(*list)->next = null;
return ok;
}int main(void)
線性表的鏈式儲存結構之單鏈表
void initlist list plist 初始化 plist next null 2 插入元素 insert 1 宣告結點p指向鍊錶第乙個結點 2 當p null時,就遍歷鍊錶,讓p的指標向後移動,不斷指向下乙個結點,i 3 若到鍊錶末尾p為空,則說明第i個元素不存在 4 否則查詢成功,在系...
線性表的鏈式儲存結構 單鏈表
線性表中每個節點有唯一的前趨節點和後繼節點 每個 物理節點增加乙個指向後繼節點的指標域 單鏈表 每個物理節點增加乙個指向後繼節點和前趨節點的指標域 雙鏈表 單鏈表的特點 當訪問乙個節點後,只能接著它的後繼節點,而無法訪問它的前趨節點。1.單鏈表插入節點 操作 將值為x的新節點 s插入到 p節點之後 ...
線性表 鏈式儲存結構之單鏈表
ifndef linklist h define linklist h include include include template class node node const elemtype data data data next null node const elemtype data,...