链表删除功能实现演示

插入算法和删除演示:

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


typedef struct Node {
	int data;  //数据域
	struct Node * pNext;   //指针域

}Node, *pNode;

//函数声明
pNode create_list();
void traverse_list(pNode  pHead);      //遍历

bool is_empty(pNode pHead);          //判断链表是否为空
int length_list(pNode pHead);        //链表的长度
bool insert_list(pNode, int, int);   //插入  第一个参数表示插入的链表  第二个参数表示插入的位置  第三个参数表示插入的元素
bool delete_list(pNode, int, int *); //第一个参数表示要删除的位置,第二个参数表示要删除的位置 第三参数表示删除的元素的地址放入指针
void sort_list(pNode pHead);

int main(void) {

	pNode  pHead = NULL;   //等价于 struct Node *pHead=NULL
	pHead = create_list();    //create_list()创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
	traverse_list(pHead);     //遍历输出

	/**
	int len = length_list(pHead);
	printf("链表的长度%d\n", len);


	sort_list(pHead);      //选择排序
	traverse_list(pHead);  //遍历输出

	*/

	insert_list(pHead, 4, 33);
	traverse_list(pHead);//遍历输出

	int val;
	if (delete_list(pHead, 4, &val)) {
		printf("删除成功,删除的元素%d:\n",val);
	}else {
		printf("删除失败,删除的元素不存在%d:\n",val);
	}
	traverse_list(pHead);//遍历输出

	 while(true){}

	return 0;
}

//创建单链表
pNode create_list() {

	int len;   //用来存放有效节点数
	int i;
	int val; //存放用户临时输入的节点数据

	//我们首先要先生成一个头结点  不存放有效数据
	pNode pHead = (pNode)malloc(sizeof(Node));
	if (NULL == pHead) {
		printf("内存分配失败");
		//程序退出
		exit(-1);
	}
	
    
	pNode pTail = pHead;    //pTail也指向了头结点
	pTail->pNext = NULL;

	printf("请输入你要输入节点的个数 len =");
	scanf_s("%d", &len);

	//假设输入的长度5,我们需要循环
	for ( i = 0; i < len; i++){
		printf("请输入第%d个节点的值:", i + 1);
		scanf_s("%d", &val);

		pNode pNew=(pNode)malloc(sizeof(Node));
		if (NULL == pNew) {
			printf("内存分配失败");
			//程序退出
			exit(-1);
		}


		pNew->data = val;
		//pHead->pNext = pNew;
		//pNew->pNext = NULL;
		pTail->pNext = pNew;  //将这个新节点挂到尾节点
		pNew->pNext = NULL;
		pTail = pNew;

	}

	return pHead;
}

//遍历
void traverse_list(pNode  pHead) {

	pNode p = pHead->pNext;
	while (p!=NULL){
		printf("%d ",p->data);
		p = p->pNext;
	}
	//换行
	printf("\n");

	return;
}

//判断链表是否为空
bool is_empty(pNode pHead) {

	if (NULL == pHead->pNext) {
		return true;
	}else {
		return false;
	}
}

//求一个链表的长度
int length_list(pNode pHead) {
	pNode p=pHead->pNext;   //第一个节点
	int len = 0;
	while (NULL != p) {   //只要指针指向的下一个元素不是空,指针就继续向后移动
		++len;
		p=p->pNext;
	}
	return len;
}


//排序算法
void sort_arr(pNode pHead) {

	int i, j, tmp;
	int arr[6] = { 5,8,45,2,9,3 };
	int len=length_list(pHead);  //获取链表长度
	pNode p, q;
	for (i = 0; i < len-1; i++){

		for (j = i+1; j < len; j++){
			
		}

	}

}



//选择排序  从小到大排
void sort_list(pNode pHead){
	int i,j,t;
	int len = length_list(pHead);  //获取链表长度
	pNode p,q;
	for (i = 0, p = pHead->pNext; i < len - 1; ++i, p = p->pNext){
		for (j = i + 1, q = p -> pNext; j < len; ++j, q = q->pNext) {
			if (p->data > q->data) {        //类似于 数组中的: a[i] > a[j]
				t = p->data;                //类似于数组中的: t = a[i];
				p->data = q->data;          //类似于数组中的: a[i] = a[j];
				q->data = t;                // 类似于数组中的: a[j] = t;
			}
		}
	}
}


//在pHead所指向链表的第pos个节点的前面插入-一个新的结点,该节点的值是val,并 且pos的值是从1开始
bool insert_list(pNode pHead, int pos, int val) {

	int i = 0;
	pNode p = pHead;
	while (NULL != p && i < pos - 1) {
		p = p->pNext;
		++i;
	}
	if (i > pos - 1 || NULL == p) {
		return false;
	}
	pNode pNew = (pNode)malloc(sizeof(Node));
	if(NULL == pNew){

		printf("动态分配内存失败!");
		exit(-1);
	}
	
	pNew->data = val;
	//定义一个临时节点,数据交换存储
	pNode tmp = p->pNext;
	 p->pNext=pNew;
	 pNew->pNext = tmp;


	 return true;

}


bool delete_list(pNode pHead, int pos, int * val) {

	int i = 0;
	pNode p = pHead;
	while (NULL != p->pNext && i < pos - 1) {
		p = p->pNext;
		++i;
	}
	if (i > pos - 1 || NULL == p->pNext) {
		return false;
	}

	
	pNode tmp=p->pNext;  //将需要删除的节点临时保存起来
	*val = tmp->data;

	p->pNext = p->pNext->pNext;   //删除p节点后一个节点
	free(tmp);
	tmp = NULL;

	return true;
}

 

链表删除功能实现演示

上一篇:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse问题解析


下一篇:LeetCode_155-Min Stack