国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

7-數(shù)據(jù)結(jié)構(gòu)-(帶頭節(jié)點)單鏈表的增刪改查

這篇具有很好參考價值的文章主要介紹了7-數(shù)據(jù)結(jié)構(gòu)-(帶頭節(jié)點)單鏈表的增刪改查。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

問題:

????????單鏈表帶頭結(jié)點的創(chuàng)建以及輸出,以及帶與不帶頭節(jié)點的區(qū)別

思路:

  1. 單鏈表,邏輯上是線性結(jié)構(gòu),由許多單鏈表結(jié)點,串成一串。其單鏈表結(jié)構(gòu)體中,數(shù)據(jù)項由data數(shù)據(jù)域和結(jié)點指針域。
  2. 帶頭節(jié)點是為了使在空表時的操作更統(tǒng)一。如果不帶頭節(jié)點,空表插入時,直接讓頭指針,和第一節(jié)點指針相等即可。而非空表插入時,則時s->next=l->next;l->next=s;頭插,兩個操作。而帶上頭節(jié)點,所有情況下的插入操作,都同意了即都為s->next=l->next;l->next=s。
  3. 值得注意的是,帶頭節(jié)點的單鏈表,遍歷輸出時,記得從第二哥結(jié)點開始遍歷,即讓結(jié)點指針=頭指針的指針域。即snode*s =l->next;
  4. 在指針改變實際值時,C語言中,要么來哥雙指針,要么正常一維指針,最后返回頭指針,主函數(shù)內(nèi)接收即可。我覺得為了好理解,就用返回這個吧,整那么花里胡哨,也挺亂的。嗯

頭插法:

//創(chuàng)建帶頭節(jié)點的單鏈表
snode* sheadlist(snode* l,int n)
{
		snode *phead=l;      
		phead=(snode*)malloc(sizeof(snode));//創(chuàng)建頭節(jié)點 
		phead->next=NULL;  
		
		int i=0,x=n,k=0;
		printf("請輸入想要插入的值\n");
		for(i=0;i<x;i++)
		{
			printf("輸入第%d個值\n",i+1);
			scanf("%d",&k);
			snode *p=(snode*)malloc(sizeof(snode));
			p->data=k;
			p->next=phead->next;
			phead->next=p;
				
		}
		
		return phead;
} 

尾插法:

//創(chuàng)建帶頭結(jié)點尾插法 
linklist srearlist(linklist l,int x)
{
	snode* phead=l;//創(chuàng)建頭節(jié)點
	phead=(linklist)malloc(sizeof(snode));//用頭結(jié)點創(chuàng)造空間,指針l沒有創(chuàng)建,因此返回的時候返回頭節(jié)點 才能獲取整個單鏈表地址 
	phead->next=NULL;
	int i,k;
	snode *end=phead;//工作指針,從頭節(jié)點開始工作 
	printf("請輸入值\n");
	for(i=0;i<x;i++)
	{

		scanf("%d",&k);
	
		snode *p=(snode*)malloc(sizeof(snode));//創(chuàng)建新結(jié)點,用來尾插進單鏈表 
		p->data=k;
		
		end->next=p;//直接給新結(jié)點連接起來 
		end=p;      //因為尾插,所以要時刻知道最后一個結(jié)點的位置,因此s指針也跑到新加入的結(jié)點p上面. 
	}
	end->next=NULL;	
	
	return phead;//頭節(jié)點始終指向整個單鏈表,因此返回頭節(jié)點地址,用來獲取整個字符串 
} 

按位查找,返回結(jié)點:

//返回第i個結(jié)點指針
snode* Searchnode(snode* phead,int i)
{
	int count=1;//從有序數(shù)據(jù),數(shù)組第一個開始計算
	snode* p=phead->next;
	if(i==0) return phead;//返回頭節(jié)點
	if(i<0) return NULL;  //無效值
	while(p!=NULL && count != i)  //進行遍歷,每一次進行比對,每次遍歷指針后移
	{
		p=p->next;
		count++;
	}
	
	return p;	
} 

按值查找,返回位置:(根據(jù)不同的情況需求在while判斷條件那里改變條件,進而求得想要的位置即可)

//按值查找,查找比x大的,并返回應(yīng)插入的位置 
int Search_zhinode(snode* phead,int x)
{

	snode* p=phead->next;
	int count=1;
	while(x>p->data)
	{
		p=p->next;
		count++;
	}
	
	
	return count;	
} 

在某個位置插入一個結(jié)點:(按位查找的妙用:

(用按位查找找到第i-1個結(jié)點,通過這個結(jié)點,進行操作))

//在某個位置插入一個結(jié)點 
snode* SInsert(snode* phead,int pos,int x)
{
	if(pos<1 || pos>SLength(phead)) return NULL;
    //進行插入操作
	snode* p=(snode*)malloc(sizeof(snode));
	p->data=x;
	//獲取第pos-1個位置上的結(jié)點,在它后面插入 
	snode* ppre=Search_weinode(phead,pos-1);
	p->next=ppre->next;
	ppre->next=p;
	
	return phead;
}

計算帶頭結(jié)點單鏈表長度:

//計算單鏈表長度
int SLenth(snode* phead)
{
	if(phead==NULL) return 0;
	
	int count=1;
	snode* p =phead->next;//從有效數(shù)據(jù)第一個開始 
	while(p->next!=NULL)
	{
		p=p->next;
		count++;
	}
	return count;
 } 

刪除第i個結(jié)點:(用按位查找找到第i-1個結(jié)點,通過這個結(jié)點,進行操作)

//刪除第i個結(jié)點 
snode* SDelete(snode* phead,int i,int *x)
{
	if(i<1 || i>SLenth(phead)) return NULL;
	
	snode* p =Search_weinode(phead,i-1);
	snode* q=p->next;
	*x=q->data;
	
	p->next=q->next;
	free(q);
	return phead;
}


?

代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-628943.html

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//創(chuàng)建帶頭結(jié)點單鏈表 
typedef struct snode
{
	int data;
	struct snode *next;
}snode,*linklist;
//創(chuàng)建帶頭節(jié)點的單鏈表
snode* sheadlist(linklist l,int n)
{
		snode *phead=l;      
		phead=(snode*)malloc(sizeof(snode));//創(chuàng)建頭節(jié)點 
		phead->next=NULL;  
		
		int i=0,x=n,k=0;
		printf("請輸入想要插入的值\n");
		for(i=0;i<x;i++)
		{
			printf("輸入第%d個值\n",i+1);
			scanf("%d",&k);
			snode *p=(snode*)malloc(sizeof(snode));
			p->data=k;
			p->next=phead->next;
			phead->next=p;
				
		}
		
		return phead;
} 

//創(chuàng)建帶頭結(jié)點尾插法 
linklist srearlist(linklist l,int x)
{
	snode* phead=l;//創(chuàng)建頭節(jié)點
	phead=(linklist)malloc(sizeof(snode));//用頭結(jié)點創(chuàng)造空間,指針l沒有創(chuàng)建,因此返回的時候返回頭節(jié)點 才能獲取整個單鏈表地址 
	phead->next=NULL;
	int i,k;
	snode *end=phead;//工作指針,從頭節(jié)點開始工作 
	printf("請輸入值\n");
	for(i=0;i<x;i++)
	{

		scanf("%d",&k);
	
		snode *p=(snode*)malloc(sizeof(snode));//創(chuàng)建新結(jié)點,用來尾插進單鏈表 
		p->data=k;
		
		end->next=p;//直接給新結(jié)點連接起來 
		end=end->next;      //因為尾插,所以要時刻知道最后一個結(jié)點的位置,因此s指針也跑到新加入的結(jié)點p上面. 
	}
	end->next=NULL;	
	
	return phead;//頭節(jié)點始終指向整個單鏈表,因此返回頭節(jié)點地址,用來獲取整個字符串 
} 
//返回第i個結(jié)點指針
snode* Search_weinode(snode* phead,int i)
{
	int count=1;
	snode* p=phead->next;//從頭節(jié)點的后繼節(jié)點開始遍歷 
	if(i==0) return phead;
	if(i<0) return NULL;
	//遍歷,當值小于查找值時,一直遍歷,直到相等,count停止增加,此時便時所找位置處的結(jié)點,返回即可, 
	while(p!=NULL && count != i)
	{
		p=p->next;
		count++;
	}
	
	return p;	
} 
//按值查找,查找比x大的,并返回應(yīng)插入的位置 
int Search_zhinode(snode* phead,int x)
{
	//默認單鏈表單調(diào)遞增,因此從頭遍歷的話,看誰比x大,便找到了,主要畫圖清楚 
	snode* p=phead->next;
	int count=1;
	while(x>p->data)
	{
		p=p->next;
		count++;
	}
	
	
	return count;	
} 

void slprintf(snode *s)
{
	if(s==NULL) return NULL; //空表 情況 
	
	snode *scan = s->next;//因為帶頭結(jié)點第一個結(jié)點為頭節(jié)點,所以打印從第二個結(jié)點打印,因此這里需要注意 
	while(scan != NULL) 
	{
		printf("%d->",scan->data);
		scan = scan->next;
	}                   
	 
	printf("NULL\n");
}
//在某個位置插入一個結(jié)點 
snode* SInsert(snode* phead,int pos,int x)
{
	//進行插入操作
	//創(chuàng)建需要插入的結(jié)點,給結(jié)點賦值 
	snode* p=(snode*)malloc(sizeof(snode));
	p->data=x;
	//獲取第pos-1個位置上的結(jié)點,在它后面插入 
	snode* ppre=Search_weinode(phead,pos-1);
	//進行插入操作 
	p->next=ppre->next;
	ppre->next=p;
	
	return phead;
}
//計算單鏈表長度
int SLenth(snode* phead)
{
	if(phead==NULL) return 0;
	
	int count=1;
	snode* p =phead->next;//從有效數(shù)據(jù)第一個開始 
	while(p->next!=NULL)
	{
		p=p->next;
		count++;
	}
	return count;
 } 
//刪除第i個結(jié)點 
snode* SDelete(snode* phead,int i,int *x)
{
	//判斷插入合法性 
	if(i<1 || i>SLenth(phead)) return NULL;
	//找到刪除結(jié)點的前驅(qū)結(jié)點 
	snode* p =Search_weinode(phead,i-1);//用按位查找,找到后返回前驅(qū)結(jié)點 
	//給q刪除,因此先讓q指針指向刪除結(jié)點,取出值,隨后p的指針域指向q的后繼節(jié)點,最后給q釋放。 
	snode* q=p->next;
	*x=q->data;
	//刪除操作 
	p->next=q->next;
	free(q);
	return phead;
}

int main()
{
	//創(chuàng)建頭節(jié)點 
	snode* phead;
//	phead=sheadlist(phead,3);
	//尾插法建立帶頭節(jié)點單鏈表 
	phead=srearlist(phead,5); 
	//打印單鏈表 
	slprintf(phead);
//	snode *p=Searchnode(phead,2);
	//在有序的列表里面(默認有序),插入數(shù)值4,單鏈表仍有序 
	int pos=Search_zhinode(phead,4);
	printf("pos=%d\n",pos);
	//找到需要插入的位置后,進行在pos處的插入操作——即找到pos的前驅(qū)結(jié)點,之后進行插入 
	phead=SInsert(phead,pos,4);
	slprintf(phead);
	//計算單鏈表的長度 
	int len=SLenth(phead);
	printf("單鏈表長度為%d\n",len);
	//刪除第4個結(jié)點,并返回刪除結(jié)點的數(shù)值 
	int x=0;
	phead=SDelete(phead,4,&x);//因為需要給刪除數(shù)值帶回來,所以給x的地址傳過去 
	printf("刪除了%d\n",x);
	slprintf(phead);
	return 0;
 } 

到了這里,關(guān)于7-數(shù)據(jù)結(jié)構(gòu)-(帶頭節(jié)點)單鏈表的增刪改查的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】反轉(zhuǎn)鏈表、鏈表的中間節(jié)點、鏈表的回文結(jié)構(gòu)(單鏈表OJ題)

    【數(shù)據(jù)結(jié)構(gòu)】反轉(zhuǎn)鏈表、鏈表的中間節(jié)點、鏈表的回文結(jié)構(gòu)(單鏈表OJ題)

    正如標題所說,本文會圖文詳細解析三道單鏈表OJ題,分別為: ?反轉(zhuǎn)鏈表 (簡單) ?鏈表的中間節(jié)點 (簡單) ?鏈表的回文結(jié)構(gòu) (較難) 把他們放在一起講的原因是: ?反轉(zhuǎn)鏈表 和 ?鏈表的中間節(jié)點 是 ?鏈表的回文結(jié)構(gòu) 的基礎(chǔ) 為什么這樣說?請往下看: 目錄 1. 反轉(zhuǎn)鏈

    2024年02月13日
    瀏覽(104)
  • 數(shù)據(jù)結(jié)構(gòu):圖文詳解單鏈表的各種操作(頭插法,尾插法,任意位置插入,刪除節(jié)點,查詢節(jié)點,求鏈表的長度,清空鏈表)

    數(shù)據(jù)結(jié)構(gòu):圖文詳解單鏈表的各種操作(頭插法,尾插法,任意位置插入,刪除節(jié)點,查詢節(jié)點,求鏈表的長度,清空鏈表)

    目錄 ?一.什么是鏈表 二.鏈表的實現(xiàn) 節(jié)點的插入 頭插法 尾插法 指定位置插入 節(jié)點的刪除 刪除第一次出現(xiàn)的節(jié)點 刪除所有節(jié)點 節(jié)點的查找 鏈表的清空 鏈表的長度 前言: 在上一篇文章中,我們認識了線性數(shù)據(jù)結(jié)構(gòu)中的順序表,而本篇文章則是介紹線性數(shù)據(jù)結(jié)

    2024年02月05日
    瀏覽(104)
  • 帶頭節(jié)點的單鏈表的思路及代碼實現(xiàn)

    帶頭節(jié)點的單鏈表的思路及代碼實現(xiàn)

    單鏈表是一種鏈式存取的數(shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。鏈表中的數(shù)據(jù)是以結(jié)點來表示的,每個結(jié)點的構(gòu)成:元素(數(shù)據(jù)元素的映象) +指針(指示后繼元素存儲位置,元素就是存儲數(shù)據(jù)的存儲單元,指針就是連接每個結(jié)點的地址數(shù)據(jù)。) 以上是

    2023年04月08日
    瀏覽(63)
  • 數(shù)據(jù)結(jié)構(gòu)(2)—單鏈表(帶頭結(jié)點和不帶頭結(jié)點)

    ??????? 單鏈表 是通過一組任意的存儲單元來存儲線性表中的數(shù)據(jù)元素。每個結(jié)點都有 data數(shù)據(jù)域 (用來存放數(shù)據(jù)元素)和 next指針域 (用來存放后繼節(jié)點的地址)。 ??????? 對于順序表,單鏈表可以解決順序表需要一整個大量的連續(xù)的存儲單元的缺點,單鏈表的元素

    2024年02月05日
    瀏覽(86)
  • 【數(shù)據(jù)結(jié)構(gòu)】C語言實現(xiàn)單鏈表(帶頭結(jié)點)

    Single linked list with leading nodes 關(guān)于不帶頭結(jié)點的單鏈表:不帶頭結(jié)點的單鏈表 結(jié)點定義: 接口定義: 初始化需要申請頭結(jié)點,讓頭指針指向空的頭結(jié)點。 將申請結(jié)點的代碼進行封裝: 需要越過頭結(jié)點 找到尾結(jié)點,然后插入到尾結(jié)點的后面。 對比不帶頭結(jié)點的單鏈表的尾插

    2024年02月02日
    瀏覽(1332)
  • 【數(shù)據(jù)結(jié)構(gòu)】雙向帶頭循環(huán)鏈表的實現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】雙向帶頭循環(huán)鏈表的實現(xiàn)

    前言:在前面我們學習了順序表、單向鏈表,今天我們在單鏈表的基礎(chǔ)上進一步來模擬實現(xiàn)一個帶頭雙向鏈表。 ?? 博主CSDN主頁:衛(wèi)衛(wèi)衛(wèi)的個人主頁 ?? ?? 專欄分類:數(shù)據(jù)結(jié)構(gòu) ?? ??代碼倉庫:衛(wèi)衛(wèi)周大胖的學習日記?? ??關(guān)注博主和博主一起學習!一起努力! 帶頭雙向循環(huán)鏈

    2024年01月15日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)-帶頭雙向循環(huán)鏈表的實現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)-帶頭雙向循環(huán)鏈表的實現(xiàn)

    前言 ? ? ? ? ? 帶頭雙向循環(huán)鏈表是一種重要的數(shù)據(jù)結(jié)構(gòu),它的結(jié)構(gòu)是很完美的,它彌補了單鏈表的許多不足,讓我們一起來了解一下它是如何實現(xiàn)的吧! ? ? ? ? 它的節(jié)點中存儲著數(shù)據(jù)和兩個指針,一個 指針_prev 用來記錄前一個節(jié)點的地址,另一個指針 _next 用來記錄后一

    2024年02月13日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)——帶頭節(jié)點的雙向循環(huán)列表

    數(shù)據(jù)結(jié)構(gòu)——帶頭節(jié)點的雙向循環(huán)列表

    帶頭節(jié)點的雙向循環(huán)鏈表 是一種特殊的雙向鏈表,它與普通的雙向鏈表相比,最大的區(qū)別是鏈表頭結(jié)點的 next 指針不再指向第一個實際節(jié)點,而是指向鏈表中的第一個節(jié)點。同時,鏈表尾結(jié)點的 prev 指針也不再指向 NULL,而是指向鏈表中的最后一個節(jié)點。 另外, 帶頭節(jié)點的

    2024年02月11日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)三:線性表之單鏈表(帶頭結(jié)點單向)的設(shè)計與實現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)三:線性表之單鏈表(帶頭結(jié)點單向)的設(shè)計與實現(xiàn)

    ? ? ? ? 線性表的鏈式存儲結(jié)構(gòu)正是所謂的單鏈表,何謂單鏈表?通過地址將每一個數(shù)據(jù)元素串起來,進行使用,這可以彌補順序表在進行任意位置的插入和刪除需要進行大量的數(shù)據(jù)元素移動的缺點,只需要修改指針的指向即可;單鏈表的種類又可劃分為很多種,本篇博客詳

    2024年02月19日
    瀏覽(107)
  • 【數(shù)據(jù)結(jié)構(gòu)】鏈表:帶頭雙向循環(huán)鏈表的增刪查改

    【數(shù)據(jù)結(jié)構(gòu)】鏈表:帶頭雙向循環(huán)鏈表的增刪查改

    本篇要分享的內(nèi)容是帶頭雙向鏈表,以下為本片目錄 目錄 一、鏈表的所有結(jié)構(gòu) 二、帶頭雙向鏈表 2.1尾部插入 2.2哨兵位的初始化 2.3頭部插入 2.4 打印鏈表 2.5尾部刪除 2.6頭部刪除 ?2.7查找結(jié)點 2.8任意位置插入 2.9任意位置刪除? 在剛開始接觸鏈表的時候,我們所學僅僅所學的

    2024年02月05日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包