溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

單鏈表的練習(xí)-頭插法

發(fā)布時(shí)間:2020-07-16 01:51:09 來源:網(wǎng)絡(luò) 閱讀:628 作者:dreamhorse 欄目:編程語言
/*單鏈表的練習(xí)-頭插法*/
/*單鏈表由頭結(jié)點(diǎn)就可以唯一確定*/
#include?<malloc.h>
#include?<stdio.h>
#include?<stdlib.h>
//定義單鏈表結(jié)構(gòu)
typedef?struct?Node{
	int?data;??//數(shù)據(jù)域
	Node?*?pNext;??//指針域
}NODE,*?PNODE;

PNODE?create_list(void);??//創(chuàng)建鏈表
void?show_list(PNODE?pHead);??//顯示鏈表
void?insert(PNODE?pHead,int?pos,int?inval);?//向鏈表中某個(gè)位置插入元素
int?deleteList(PNODE?pHead,int?pos);?//刪除鏈表某個(gè)位置上的值
void?find(PNODE?pHead,int?fval);??//在鏈表中查找某個(gè)元素

void?main(){
	PNODE?pHead?=?NULL;??//定義一個(gè)頭結(jié)點(diǎn),初始值為空
	pHead?=?create_list();
	show_list(pHead);
	insert(pHead,2,100);
	show_list(pHead);
	find(pHead,3);
	printf("你所刪除的值是%d\n",deleteList(pHead,2));
	show_list(pHead);
}

PNODE?create_list(void){
	int?length,val;
	PNODE?pHead?=?(PNODE)malloc(sizeof(NODE));??//向內(nèi)存申請(qǐng)頭節(jié)點(diǎn)空間
	pHead->pNext=NULL;???//開始的時(shí)候只有頭結(jié)點(diǎn)自身,沒有其它結(jié)點(diǎn)
	if(NULL?==?pHead){
		printf("分配失敗,程序終止");
		exit(-1);
	}
	printf("請(qǐng)輸入需要生成的單鏈表的長(zhǎng)度:");
	scanf("%d",&length);
	for(int?i=0;i<length;i++){????//for循環(huán)生成指定個(gè)數(shù)的結(jié)點(diǎn)
		printf("請(qǐng)輸入第%d個(gè)節(jié)點(diǎn)的值:?",i+1);
		scanf("%d",&val);
		PNODE?pNew?=?(PNODE)malloc(sizeof(NODE));
		if(NULL?==?pNew){
		printf("分配失敗,程序終止");
		exit(-1);
		}
		pNew->data=val;???//給新申請(qǐng)的結(jié)點(diǎn)數(shù)據(jù)域賦值
		pNew->pNext=pHead->pNext;??//頭指針指向的下一個(gè)結(jié)點(diǎn)的地址賦給了新結(jié)點(diǎn)的指針域,也就是在當(dāng)前頭結(jié)點(diǎn)后面直接插入一個(gè)新結(jié)點(diǎn)
		pHead->pNext=pNew;?//頭結(jié)點(diǎn)指向了新的結(jié)點(diǎn)

	}
	return?pHead;???//函數(shù)返回頭結(jié)點(diǎn)的地址
}

void?show_list(PNODE?pHead){
	printf("單鏈表的值如下:\n");
	PNODE?P?=?pHead->pNext;
	while(P?!=?NULL){??????//while巡檢打印出所以結(jié)點(diǎn),直到下個(gè)結(jié)點(diǎn)不存在
		printf("%d?",P->data);
		P=P->pNext;
	}
	printf("\n");
}

void?insert(PNODE?pHead,int?pos,int?inval){
	PNODE?P?=?pHead;
	int?j=0;
	while(P?!=?NULL?&&?j<pos-1){???//如果結(jié)點(diǎn)不為空,把P指針移動(dòng)到插入位置的前一個(gè)結(jié)點(diǎn)位置
		P?=?P->pNext;
		j++;
	}
	if(P?==?NULL){
		printf("插入失敗\n");
		exit(-1);
	}else{
		PNODE?pNew?=?(PNODE)malloc(sizeof(NODE));??//申請(qǐng)新的結(jié)點(diǎn)
		pNew->data=inval;???//將要插入的值賦值給新結(jié)點(diǎn)的數(shù)據(jù)域
		pNew->pNext=P->pNext;??//新結(jié)點(diǎn)指向P指針指向的下一個(gè)結(jié)點(diǎn)
		P->pNext=pNew;?//P指針?biāo)诘慕Y(jié)點(diǎn)指向新結(jié)點(diǎn)
		printf("你已經(jīng)成功的插入了元素%d到鏈表中.\n",inval);
	}
}

int?deleteList(PNODE?pHead,int?pos){
	PNODE?P?=?pHead,S;
	
	int?j=0,x;
	if(P?!=?NULL?&&?j<pos-1){
		P?=?P->pNext;
		j++;
	}
	if(P?==?NULL){
		printf("刪除失敗,數(shù)組是空的");
		exit(-1);
	}else{
		S?=?P->pNext;
		P->pNext?=?S->pNext;
		x?=?S->data;
		free(S);
		return?x;
	}
}

void?find(PNODE?pHead,int?fval){
	PNODE?P?=?pHead;
	int?cnt=0;
	if(P?==?NULL){
		printf("不用找了,鏈表是空的\n");
		exit(-1);
	}
	while(P?!=?NULL){
		P?=?P->pNext;
		++cnt;
		if(P->data==fval){
			printf("你要找的數(shù)%d在鏈表中,它在鏈表的第%d個(gè)位置\n",fval,cnt);
			break;
		}
	}
}

結(jié)果截圖

單鏈表的練習(xí)-頭插法

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI