单链表的练习-头插法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表的练习-头插法相关的知识,希望对你有一定的参考价值。

/*单链表的练习-头插法*/
/*单链表由头结点就可以唯一确定*/
#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;
		}
	}
}

结果截图

技术分享

本文出自 “明镜亦非台” 博客,请务必保留此出处http://kk876435928.blog.51cto.com/3530246/1868677

以上是关于单链表的练习-头插法的主要内容,如果未能解决你的问题,请参考以下文章

单链表的头插法

线性表的链式存储-单链表

单链表的头插法与尾插法代码实现及详解

单链表建立——头插法和尾插法

C实现头插法和尾插法来构建单链表(不带头结点)

C++练习 | 不使用头插法逆转单链表