溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

線性表的鏈式存儲之單鏈表的尾插法

發(fā)布時間:2020-07-31 10:47:06 來源:網(wǎng)絡 閱讀:806 作者:dreamhorse 欄目:編程語言

對單鏈表進行遍歷、查找、插入、刪除等操作,最終效果如下:

線性表的鏈式存儲之單鏈表的尾插法

相關C代碼如下:

/*線性表的鏈式存儲之單鏈表的尾插法*/

#include?<stdio.h>
#include?<stdlib.h>
#include?<malloc.h>

/*定義變量*/
typedef?int?DataType;

typedef?struct?node{?????//定義鏈表結點數(shù)據(jù)結構
	DataType?data;
	struct?node?*?pNext;
}NODE;

typedef?NODE?*?pNODE;???//定義鏈表結點類型指針

/*函數(shù)聲明*/
pNODE?createLinkList(void);???//尾插法建立單鏈表
void?TraverseLinkList(pNODE?pHead);?//遍歷單鏈表各個結點
pNODE?LocateNode(pNODE?pHead,int?k);?//查找鏈表中是否存在某個結點
void?InsertLinkList(pNODE?pHead,int?i,DataType?x);??//向鏈表中插入結點
DataType?DeleteLinkList(pNODE?pHead,int?i);

/*程序正文*/

int?main(void){????????????//主函數(shù)
	pNODE?pHead=NULL;??????//

	pHead?=?createLinkList();??//創(chuàng)建鏈表,并將頭結點地址返回
	TraverseLinkList(pHead);??//將頭結點地址傳入遍歷函數(shù),遍歷鏈表各個結點
	pNODE?lNode?=?LocateNode(pHead,7);?//在鏈表中查找指定的值
	if(lNode?==?NULL){
		printf("鏈表中不存在你要查找的值\n");
	}else{
		printf("鏈表中存在你要查找的值\n");
	}
	printf("向鏈表中第三個位置插入100\n");
	InsertLinkList(pHead,3,100);
	TraverseLinkList(pHead);?
	printf("刪除鏈表中第四個結點,刪除的結點值是%d\n",DeleteLinkList(pHead,4));
	TraverseLinkList(pHead);?

	return?0;
}

pNODE?createLinkList(void){

	pNODE?pHead,pTail;????//定義頭結點指針和尾結點指針
	int?length,i,val;
	pHead=(pNODE)malloc(sizeof(NODE));??//給頭結點在內存中申請地址空間
	pTail=pHead;???//初始狀態(tài)頭指針和尾指針相同
	
	if(pHead?==?NULL){??????//如果頭結點申請失敗就退出程序
		printf("內存分配頭結點失敗.");
		exit(-1);
	}
	printf("請輸入鏈表的結點個數(shù):");
	scanf("%d",&length);
	for(i=0;i<length;i++){???//手動依次輸入新建鏈表需要的結點值
		printf("請輸入結點%d的值:",i+1);?
		scanf("%d",&val);
		pNODE?pNew=(pNODE)malloc(sizeof(NODE));??//給新結點在內存中申請地址空間
		if(pNew?==?NULL){???//如果新結點地址分配地址空間失敗,就退出程序
			printf("坑爹啊,沒有足夠的內存分配了");
			exit(-1);
		}
		pNew->data=val;???//給新結點賦值
		pTail->pNext=pNew;??//新結點連接到尾結點之后
		pTail=pNew;??//尾指針指向新結點
	}
	pTail->pNext=NULL;	//終端結點指針域置為空,單鏈表生成
	return?pHead;	//返回鏈表頭結點
}

void?TraverseLinkList(pNODE?pHead){
	printf("當前鏈表各個結點的值是:");
	pNODE?pNew?=?pHead->pNext;??//獲取首結點,然后從首結點開始進行遍歷
	while(pNew?!=?NULL){??????//判斷下一個結點是否為空,如果不為空,那么就輸出結點數(shù)據(jù)域里的值
		printf("%d?",pNew->data);
		pNew?=?pNew->pNext;
	}
	printf("\n");
}

pNODE?LocateNode(pNODE?pHead,int?k){??//查看鏈表中是否存在某個值的結點
	pNODE?pNew?=?pHead->pNext;
	while(pNew?&&?pNew->data!=k){
		pNew=pNew->pNext;		
	}
	return?pNew;
}

void?InsertLinkList(pNODE?pHead,int?i,DataType?x){???//向鏈表第i個位置插入結點x
	pNODE?p,s;int?j;
	p=pHead;j=0;
	while(p?!=?NULL?&&?j<i-1){
		p?=?p->pNext;???//是p指向第i-1個結點,即是指向要插入位置的前一個結點
		j++;
	}
	if(p?==?NULL){???????
		printf("插入位置錯誤");
		exit(-1);
	}
	s?=?(pNODE)malloc(sizeof(NODE));??//給新結點申請內存空間
	s->data=x;						//給新結點數(shù)據(jù)域賦值
	s->pNext=p->pNext;??????????????//將新結點指向p指針所指向的結點的下一個結點
	p->pNext=s;?????????????????????//將s結點的地址賦值給p結點所指向結點的指針域,即讓i-1位置的結點指向s結點
}


DataType?DeleteLinkList(pNODE?pHead,int?i){
	pNODE?p,s;int?j;
	DataType?x;
	p=pHead;j=0;
	while(p?!=?NULL?&&?j<i-1){
		p=p->pNext;????//是p指向第i-1個結點,即是指向要插入位置的前一個結點
		j++;
	}

	if(p?==NULL){
		printf("刪除位置錯誤");
		exit(-1);
	}
	s?=?p->pNext;???????????//s結點就是要被刪除的結點
	p->pNext=p->pNext->pNext;??//s前一個結點跳過s結點直接指向s的下一個結點,此時s結點成了幽靈了
	x?=?s->data;??//將s結點的值保存下來
	free(s);??//在內存空間中將s釋放掉
	return?x;???
}


向AI問一下細節(jié)

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

AI