單鏈表的練習-頭插法

/*單鏈表的練習-頭插法*/
/*單鏈表由頭結點就可以唯一確定*/
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
//定義單鏈表結構
typedef struct Node{
	int data;  //數據域
	Node * pNext;  //指針域
}NODE,* PNODE;

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

void main(){
	PNODE pHead = NULL;  //定義一個頭結點,初始值爲空
	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));  //向內存申請頭節點空間
	pHead->pNext=NULL;   //開始的時候只有頭結點自身,沒有其它結點
	if(NULL == pHead){
		printf("分配失敗,程序終止");
		exit(-1);
	}
	printf("請輸入需要生成的單鏈表的長度:");
	scanf("%d",&length);
	for(int i=0;i<length;i++){    //for循環生成指定個數的結點
		printf("請輸入第%d個節點的值: ",i+1);
		scanf("%d",&val);
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if(NULL == pNew){
		printf("分配失敗,程序終止");
		exit(-1);
		}
		pNew->data=val;   //給新申請的結點數據域賦值
		pNew->pNext=pHead->pNext;  //頭指針指向的下一個結點的地址賦給了新結點的指針域,也就是在當前頭結點後面直接插入一個新結點
		pHead->pNext=pNew; //頭結點指向了新的結點

	}
	return pHead;   //函數返回頭結點的地址
}

void show_list(PNODE pHead){
	printf("單鏈表的值如下:\n");
	PNODE P = pHead->pNext;
	while(P != NULL){      //while巡檢打印出所以結點,直到下個結點不存在
		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){   //如果結點不爲空,把P指針移動到插入位置的前一個結點位置
		P = P->pNext;
		j++;
	}
	if(P == NULL){
		printf("插入失敗\n");
		exit(-1);
	}else{
		PNODE pNew = (PNODE)malloc(sizeof(NODE));  //申請新的結點
		pNew->data=inval;   //將要插入的值賦值給新結點的數據域
		pNew->pNext=P->pNext;  //新結點指向P指針指向的下一個結點
		P->pNext=pNew; //P指針所在的結點指向新結點
		printf("你已經成功的插入了元素%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("刪除失敗,數組是空的");
		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("你要找的數%d在鏈表中,它在鏈表的第%d個位置\n",fval,cnt);
			break;
		}
	}
}

結果截圖

wKioL1gZ2ybzcamoAABv3dJzAS0909.jpg-wh_50

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章