下载麻将游戏免费|手机麻将游戏

c語言雙向鏈表的基本操作_鏈表 c語言_管理平臺c語言鏈表

飛來科技  發布時間:2019-08-22 15:04:40

本文關鍵詞:c語言雙向鏈表的基本操作

鏈表 c語言_管理系統c語言鏈表_c語言雙向鏈表的基本操作

本文鏈接:

在未學習遞歸時,我們常用的儲存數據的方法無非就是數組。使用函數存儲數據的好處就是查詢快,但是它的益處也很明顯:

,這里我們僅成為演示,因為實際研發中,我們一般更傾向于使用內存變量執行查詢操作或者是數據的處理操作,對于升級插入刪除這樣的操作,使用較少。arraylist和vector都是使用函數方法儲存數據,此字符元素數小于實際傳輸的數據便于提高和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等存儲操作,所以索引數據快而插入數據慢,vector由于使用了synchronized方法(線程安全),通常性能上較arraylist差,而linkedlist使用雙向鏈表實現內存,按序號索引數據應該進行前向或后向數組c語言雙向鏈表的基本操作,但是插入數據時只應該記錄本項的前后項即可,所以插入速度較快。實驗題目:矩陣的儲存壓縮試驗規定:1.特殊矩陣的壓縮傳輸2.稀疏矩陣的壓縮存儲3.稀疏矩陣的迅速轉質實驗內容:1.數組的抽象數據類型adt array{數據對象:d={aj1j2…jn|n(>0)稱為數組的維數,bi是字符第i維的長度,ji是數組元素的第i 維數組,aj1j2…jn∈elemset, ji=0, …,bi-1, i=1,2, …,n}數據關系:r={r1,r2, …,rn}ri={|0≦jk≦bk-1,1≦k≦n且k≠i, 0≦ji≦bi-2,aj1...ji...jn,aj1…ji+1…jn∈d, i=2, …,n }基本操作:initarray( &a, n, bound1, …, boundn )操作結果:若維數n和各維長度合法,則構造相應的字段a,并返回ok。

而遞歸則可以實現以下很多函數所不具備的功能,此時采用了結構體來推動建立鏈表的操作。

n個結點離散分配每一個節點之間借助指針相連每一個節點有一個前驅結點和一個后繼節點首節點沒有前驅節點,尾節點沒有后繼節點

首先先定義一個簡單的結構體

struct link{
       int data;          //定義數據域
       struct link *next; //定義指針域,存儲直接后繼的節點信息
};

數據域的內容可以自己選定,指針域用來保存下一個節點的地址。

首節點:存放第一個有效數據的結點

c語言雙向鏈表的基本操作_鏈表 c語言_管理系統c語言鏈表

頭節點:在單鏈表的第一個結點之前附設一個結點,它沒有直接前驅,稱之為頭節點,頭結點的數據域可以不儲存任何信息,指針域指向第一個節點(首節點)的地址。頭結點的作用是使所有字段(包括空表)的頭指針非空

頭指針:指向頭結點的指針

尾節點:存放最后一個有效數據的結點

尾指針:指向尾節點的指針

方法:定義方式向數組中添加結點來創建一個單向遞歸

在單向遞歸(c++實現)中,鏈表的最后一個節點的nex指針指向null,而所謂的循環雙向鏈表即是指數組的最后一個節點的next指針指向首結點(注意不是頭節點,頭節點是便于鏈表操作而存在的結構體變量)。定義好存儲堆函數后,需要應用程序調用vportdefineheapregions()函數初始化這些存儲堆:將它們構成一個鏈表,以xstart鏈表結構開頭,以pxend指針指向的位置結束。前兩個成員是結點存儲的本身內容,而最后一個成員,定義為指向結構體的指針,是用來指向下一個節點的,因為只有指向下一個節點,才可以連成一串,形成所謂的數組。

1.若單鏈表為空表,則將新建結點置為頭節點

鏈表 c語言_c語言雙向鏈表的基本操作_管理系統c語言鏈表

//若此時只在鏈表中插入頭節點
struct link *p = head;
p = (struct link *)malloc(sizeof(struct link));  //讓p指向新建節點創建的內存空間
if(p == NULL){   //新建節點申請內存失敗
    exit(0);
}
//此時head也指向頭節點的地址
p->next = NULL;     //因為沒有后續節點,所以新建節點指針域置空

2.鏈表非空,則將新建結點添加到表尾

//此時已存在頭節點,再插入一個節點(首節點)
struct link *p = NULL,*pr = head;  
p = (struct link *)malloc(sizeof(struct link));
if(p == NULL){
    exit(0);
}
if(head == NULL){
    head = p;
}else{
    while(pr->next != NULL){     //當頭節點的指針域不為NULL
      pr = pr->next;             //pr指向下一個節點的地址
  }
    pr->next = p;                //使頭節點的指針域存儲下一個節點的地址
}
#include <stdio.h>
#include <stdlib.h>
struct link *AppendNode(struct link *head);
void DisplayNode(struct link *head);
void DeleteMemory(struct link *head);
//定義結構體 
struct link{
	int data; 				//定義數據域 
	struct link *next; 			//定義指針域 
}; 
int main(){
	int i =0;         			//定義i,記錄創建的節點數 
	char c;							
	struct link *head = NULL;		//創建頭指針,初始化為NULL 
	printf("DO you wang to append a new node(Y or N)?");
	scanf(" %c",&c);				
	while(c == 'Y' || c == 'y'){	//如果確定繼續添加結點 
		head = AppendNode(head);	//通過函數獲得鏈表的地址,AppendNode函數返回的是鏈表的頭指針
		                            //可以根據頭指針指向的地址來獲取鏈表中保存的數據 
		DisplayNode(head);			//根據頭指針打印鏈表 
		printf("DO you want to append a new node(Y or N)?");
		scanf(" %c",&c);
		i++; 
	}
	printf("%d new nodes hava been appended!\n",i);
	DeleteMemory(head);			//釋放占用的內存 
}
struct link *AppendNode(struct link *head){    //聲明創建節點函數 
	struct link *p = NULL,*pr = head;      //創建p指針,初始化為NULL;創建pr指針,通過pr指針來給指針域賦值 
	int data ;
	p = (struct link *)malloc(sizeof(struct link)) ; //為指針p申請內存空間,必須操作,因為p是新創建的節點 
	if(p == NULL){			//如果申請內存失敗,則退出程序 
		printf("NO enough momery to allocate!\n");
		exit(0);
	}
	if(head == NULL){		//如果頭指針為NULL,說明現在鏈表是空表 
		head = p;								//使head指針指向p的地址(p已經通過malloc申請了內存,所以有地址) 
	}else{										//此時鏈表已經有頭節點 ,再一次執行了AppendNode函數 
												//注:假如這是第二次添加節點
	                                  //因為第一次添加頭節點時,pr = head,和頭指針一樣指向頭節點的地址 
		while(pr->next!= NULL){		//當pr指向的地址,即此時的p的指針域不為NULL(即p不是尾節點) 
			pr = pr->next;	//使pr指向頭節點的指針域
		}
		pr->next = p;	//使pr的指針域指向新鍵節點的地址,此時的next指針域是頭節點的指針域 
	}
	printf("Input node data:");                   
	scanf("%d",&data);
	p->data = data; 			//給p的數據域賦值 
	p->next = NULL;			//新添加的節點位于表尾,所以它的指針域為NULL 
	return head;			//返回head的地址 
}
void DisplayNode(struct link *head){         	//輸出函數,打印鏈表 
	struct link *p = head;			// 定義p指針使其指向頭節點 
	int j = 1;									//定義j記錄這是第幾個數值 
	while(p != NULL){		//因為p = p->next,所以直到尾節點打印結束 
		printf("%5dd\n",j,p->data);			
		p = p->next;		//因為節點已經創建成功,所以p的指向由頭節點指向下一個節點(每一個節點的指針域都指向了下一個節點) 
		j++;	
	}
}
void DeleteMemory(struct link *head){			//釋放資源函數 
	struct link *p = head,*pr = NULL;	        //定義p指針指向頭節點 
	while(p != NULL){				//當p的指針域不為NULL 
		pr = p;									//將每一個節點的地址賦值給pr指針 
		p = p->next;			        //使p指向下一個節點 
		free(pr);								//釋放此時pr指向節點的內存 
	}
}

#include <stdio.h> 
#include <stdlib.h>
struct Stu *create(int n);
void print(struct Stu *head);
struct Stu{
	int id;
	char name[50];
	struct Stu *next;
};
int main(){
	int n;
	struct Stu *head = NULL;   //創建頭指針 
	printf("請輸入你想要創建的節點個數:\n");
	scanf("%d",&n);
	head = create(n);
	print(head);
}
struct Stu *create(int n){
	struct Stu *head,*node,*end;   						//定義頭節點,普通節點,尾節點 
	head = (struct Stu *)malloc(sizeof(struct Stu)); 	//給頭節點申請內存 
	end = head;        									//若是空表,則頭尾地址一致 
	for(int i=0;i<n;i++){								//利用for循環向鏈表中添加數據 
		node = (struct Stu *)malloc(sizeof(struct Stu));//給普通節點申請內存空間 
		scanf("%d %s",&node->id,node->name);	//給數據域賦值 
		end->next = node;					//讓上一個節點的數據域指向當前節點 
		end = node;     						//end指向當前節點,最終end指向尾節點 
	}
	end->next = NULL;                                   //給end的指針域置空 
	return head;                                        //返回頭節點的地址 
}
void print(struct Stu *head){
	struct Stu *p = head;
	int j =1;
	p = p->next;  //不打印頭節點的數據域中的值 
	while(p != NULL){
		printf("%d\t%d\t%s\n",j,p->id,p->name);
		p = p->next;
		j++;
	}
}

本文來自互聯網,由機器人自動采編,文章內容不代表本站觀點,請讀者自行辨別信息真偽,如有發現不適內容,請及時聯系站長處理。

相關閱讀
下载麻将游戏免费 欢乐生肖开奖官网 pc蛋蛋谁做出来的 极速pk10计划全天在线 极速时时计划 云南云南时时走势图 亿宏国际彩票注册会不会被骗 彩票在线投注平台 星辰娱乐棋牌下载 欢乐生肖官方开奖 新疆时时开奖结果69