创建链表和遍历链表算法演示

#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);
int main(void) {

	pNode  pHead = NULL;   //等价于 struct Node *pHead=NULL
	pHead = create_list();    //create_list()创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
	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;         //将新节点赋给最后的一个节点 pTail 

	}

	return pHead;
}

//遍历
void traverse_list(pNode  pHead) {

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

	return;
}

求一个链表的长度和判断一个链表是否为空

#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);

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);

	 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;
}

 

算法:
狭义的算法是与数据的存数方式密切相关
广义的算法是与数据的存储方式无关
泛型:
利用某种技术达到的效果就是:不同的存数方式,执行的操作是一样的

原创文章 378 获赞 119 访问量 18万+

猜你喜欢

转载自blog.csdn.net/ywl470812087/article/details/105849855