1. 程式人生 > >線性錶鏈式儲存的實現詳解

線性錶鏈式儲存的實現詳解

本文原創,轉載請註明:http://blog.csdn.net/j903829182/article/details/38173681

#include<stdio.h>
#include<malloc.h>
//線性表的鏈式儲存和實現,帶頭點
#define true 1
#define false 0
typedef int DataType;//定義抽象資料型別
//節點的結構體
typedef struct Node{
    DataType data;//節點的資料域
    struct Node *next;//節點的指標域
}SLNode;

//初始化
//這裡引數使用了指標的指標,是為了使主函式裡的頭指標指向這個函式開闢的空間節點
//如果不使用指標的指標,指向頭指標,那麼c語言的函式都是進行值傳遞的,這裡的引數儲存的是
//主函式裡面頭指標的值得副本,為引數賦值後,不能改變頭指標指向的值
//使用指標的指標儲存的是頭指標的地址,那麼對這個地來址裡面值的改變,就是對頭指標裡面值得改變
//所以這裡需要使用指標的指標,來進行對實參值的改變
void ListInitiate(SLNode **head){
     *head=(SLNode*)malloc(sizeof(SLNode));//申請頭節點,使頭指標指向頭節點
	 (*head)->next=NULL;//設定結束標誌為NULL
}

//求當前元素個數
int ListLength(SLNode *head){
    int num=0;//初始變數num用來計數
	SLNode *p=head;//p指向頭節點
	while(p->next!=NULL){//迴圈計數
	      p=p->next;//p指向p的下一個節點
		  num++;//累加
	}
	return num;//返回計數的值
}

//插入節點,我這裡把頭節點設定為0位置,插入資料元素時,應該從1開始
int ListInsert(SLNode *head,int i,DataType data){
    int j=0;//計數變數初始化為0
    SLNode *p=head,*q;//p指向頭節點
	//為了在i位置插入資料,應該找到i-1位置的節點,為了便於計數,我把節點從1開始計數節點的
	while(p->next!=NULL&&j<i-1){//最終讓p指向第i-1個節點
	      p=p->next;//p指向下一個節點
		  j++;//變數累加計數
	}
	if(j!=i-1){
	   printf("插入位置出錯!!!\n");//輸出提示資訊
	   return false;//返回操作結果
	}

    q=(SLNode *)malloc(sizeof(SLNode));//生成新節點
	q->data=data;//把資料給新開闢的節點
	q->next=p->next;//q指向的下一個節點是p的指向的下一個節點
	p->next=q;//p的下一個節點變為q
	return true;//返回操作結果

}


//刪除指定的節點
int ListDelete(SLNode *head,int i,DataType *data){
    SLNode *p=head,*s;//指向頭節點
	int j=0;//變數用來進行計數
	while(p->next!=NULL&&j<i-1){//找到第i-1個節點
	       p=p->next;//p指向p的下一個節點
		   j++;//自加
	}

		if(j!=i-1){
	   printf("刪除位置出錯!!!\n");//輸出提示資訊
	   return false;//返回操作結果
	}

	s=p->next;//找到
	*data=s->data;//把藥刪除節點的資料賦值給data
	p->next=s->next;//p的下一個節點為i+1
	free(s);//釋放s節點,即第i個節點
	return true;//返回結果

}

//取資料元素
int ListGet(SLNode *head,int i,DataType *data){
    SLNode *p=head;//指向頭節點
	int j=0;//計數變數初始化為0
    while(p->next!=NULL&&j<i){//查詢第i個節點
	     p=p->next;//p指向下一個元素
		 j++;//變數自加
	}

	if(j!=i){//判斷j是否等於i,是否查詢到了
	   printf("取元素的位置出錯!!!\n");//輸出錯誤資訊提示
       return false;//返回操作結果
	}

	*data=p->data;//把資料賦值給data指標
	return true;//返回操作結果
}

//輸出連結串列
void displayList(SLNode *head){//列印輸出連結串列的所有資料

	SLNode *p=head;//指向頭節點

	while(p->next!=NULL){//判斷下一個節點是否為空
		p=p->next;//p指向下一個節點
	    printf("-> %d",p->data);//輸出資訊
	}
	printf("\n");//換行
}

//撤銷單鏈表
//引數用指標的指標是為了改變頭指標的值。不使用,則不能改變
void Destroy(SLNode **head){//撤銷連結串列的節點
     SLNode *p=*head,*q;
	 while(p->next!=NULL){//判斷是否為空
	      q=p;//把q指向p所指向的節點
		  p=p->next;//p指向一個節點下
		  free(q);//釋放q所指向的節點
	 }
	 *head=NULL;//使頭指標指向空
}
//主函式
int main(){
	SLNode *head;//定義指標變數
	int i,x;////定義int變數
	ListInitiate(&head);//初始化頭指標變數,傳的是頭指標的地址,為的是能得到函式改變頭指標變數的值
	printf("sizeof=%d  head=%d\n",sizeof(SLNode),head);//測試結構體的佔的記憶體大小,和頭指標的值
	for(i=1;i<=10;i++){//進行迴圈
	    ListInsert(head,i,i);//進行連結串列的插入
	}

	displayList(head);//輸出連結串列裡面的所有資料
	for(i=1;i<=ListLength(head);i++){//進行迴圈
	    ListGet(head,i,&x);//取連結串列裡面的值,放到x變數裡面
		printf("%d   ",x);//輸出x的值
	}
	printf("\n");//換行

	ListDelete(head,5,&x);//刪除第五個元素
	printf("x=%d\n",x);//輸出刪除元素的值
	displayList(head);//再次輸出連結串列裡面的所有資料
   return 0;
}


相關推薦

線性錶鏈儲存實現

本文原創,轉載請註明:http://blog.csdn.net/j903829182/article/details/38173681 #include<stdio.h> #include<malloc.h> //線性表的鏈式儲存和實現,帶頭點

C++實現線性錶鏈儲存結構的建立插入和刪除

主函式為: #include <iostream> using namespace std; typedef int eletype; struct Node { eletyp

線性錶鏈儲存(靜態連結串列)及其12種操作的實現

該表格中的所有複雜度均指的是當前程式中演算法的複雜度,同一個操作演算法不同複雜度不同。 對於空間複雜度:沒有程式的空間複雜度為0,任何程式的執行必須要空間。當所需的空間是常數的,就是O(1);是線性的,就是O(n),以此類推。 操作 時間複雜度(T(n)) 空間複

線性錶鏈儲存的基本操作

  線性表的順序儲存結構的特點是邏輯關係上相鄰的兩個元素在物理位置上也相鄰,因此可以隨機存取表中任意元素。線性錶鏈式儲存結構特點是用一組任意的儲存單元儲存資料元素,為了表示每個資料元素ai與其直接後繼資料元素ai+1之間的邏輯關係,對資料元素ai來說,除了儲存本身資訊外,還要儲存指示其直接後繼的資訊(即直接後

《大話資料結構》----第三章---線性錶鏈儲存結構

目錄 一、為啥要單獨說線性表的鏈式儲存結構?     由順序儲存結構的插入和刪除操作不方便,引出了鏈式儲存結構。它具有小受固定的儲存空間限制,可以比較快捷的插入和刪除操作的特點。作者就鏈式儲存結構的不同形式。如單鏈表、迴圈連結串列和雙向連結串列做了

資料結構與演算法——線性錶鏈儲存(單迴圈連結串列)

今天總結迴圈單鏈表 什麼是單迴圈連結串列? 單鏈表終端結點的指標域是指向空的,如果將其指向頭結點,這樣就形成了一個環,那麼這種首尾相接的環就夠成了單迴圈連結串列. 單鏈表中我們都是用頭指標來表示的,但是在單迴圈連結串列裡,用尾指標(指向最後一個節點)。為什麼要這樣,因為如果

線性錶鏈儲存-練習題1

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

postgres預寫日誌的核心實現-wal記錄讀取

    之前已經寫了關於wal記錄的結構、wal記錄的寫入的部落格,流複製、PITR、資料庫啟動、邏輯複製等PG功能都需要藉助wal日誌,他們是怎樣讀取wal日誌記錄的呢?這一篇部落格將會講解。 pg核心程式碼中讀取wal有固定的程式。如下結構:  XLo

資料結構——線性錶鏈表示和實現(2)

本文所有程式碼均為偽碼,僅闡述演算法基本思想——《資料結構》清華大學出版社 - 演算法1 帶頭結點的雙向迴圈連結串列(儲存結構由c2-4.h定義)的基本操作(14個) typedef struct DuLNode { ElemType data;

資料結構之線性表的鏈儲存實現(附完整程式碼)

順序表插入、刪除時需要通過移動資料來實現,影響了執行效率。 而連結串列不要求邏輯上相鄰的兩個資料元素物理上也相鄰,因此對線性表的插入、刪除不需要移動資料元素,只需要修改鏈。 下面介紹帶頭結點的鏈式表: 資料結構: typedef int ElementType; ty

Canny邊緣檢測算法原理及其VC實現(一)

常用 差分 實現圖 還需要 鏈接 傳感器 出了 關系 位置 轉自:http://blog.csdn.net/likezhaobin/article/details/6892176 圖象的邊緣是指圖象局部區域亮度變化顯著的部分,該區域的灰度剖面一般可以看作是一個階躍,既從

Jmeter正則表達提取器

正整數 image $1 默認值 應用 貪婪模式 ria 多次 正則 名稱:次正則提取器的名稱,最好取名唯一且有意義,為了方便與其他正則提取器區分。 Apply to:應用範圍 Main sample and sub_samples Main sample only

Isolation Forest算法實現

左右 clas 1.2 att bre 二叉 最大值和最小值 二叉樹 代碼實現 本文介紹的 Isolation Forest 算法原理請參看我的博客:Isolation Forest異常檢測算法原理詳解,本文中我們只介紹詳細的代碼實現過程。 1、ITree的設計與實現 首先

Sql Server參數化查詢之where in和like實現

blog charindex 語句 pan 建議 ack rop for 臨時表 文章導讀 拼SQL實現where in查詢 使用CHARINDEX或like實現where in 參數化 使用exec動態執行SQl實現where in 參數化 為每一個參數生成一個參數

wordcount代碼實現

常量 內部 t對象 mit sta see .org 系統配置 ioe /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agre

php multicast多播實現

clas -s ria socket php文件 pan php set 廣播 什麽是多播? 網絡中存在3中傳播形式,單播,廣播,多播。 1. 單播 : 就是1->1 2. 廣播 : 1->多(廣播域內) 3. 多播 : 1->組(一組ip) 1

Mysql數據庫分布事務XA

oar 存儲引擎 成了 from get 分布式事務 value ive 進展 XA事務簡介 XA 事務的基礎是兩階段提交協議。需要有一個事務協調者來保證所有的事務參與者都完成了準備工作(第一階段)。如果協調者收到所有參與者都準備好的消息,就會通知所有的事務都可以提交了(第

WebSocket安卓客戶端實現(三)–服務端主動通知

this override 連接 繼續 true www. 格式 代碼 ati   WebSocket安卓客戶端實現詳解(三)–服務端主動通知    本篇依舊是接著上一篇繼續擴展,還沒看過之前博客的小夥伴,這裏附上前幾篇地址    WebSocket安卓客戶端實現詳解(一)

WebSocket安卓客戶端實現(一)–連接建立與重連

ask 應該 header oid mha 主動推送 未收到 compile tde http://blog.csdn.net/zly921112/article/details/72973054 前言 這裏特別說明下因為WebSocket服務端是公司線上項目所以這裏ur

平面二維任意橢圓數據擬合算法推導及程序實現

tar 擬合 推導 oai http margin oci 二維 詳解 0墾oe辟煽6味h幼瀾6http://t.docin.com/laiys67141 x0涸tj妝06曬妒http://t.docin.com/sina_6267117010 9剿襖2閱b盎忍40ht