数据结构之链表

一、

算法

算法:

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

代码实现:

首先需要创建结构体变量,结构体为一个数据类型。

结构体的创建

typedef struct Node//创建一个结构体类型
{
	int data;//数据域
	struct Node* next;//指针域
}NODE, * PNODE;
//其中 NODE 相当于 struct Node 
// PNODE 相当于 struct NOde *

链表的创建

PNODE create_list()
{
	int len;//链表成员个数
	int i;
	int val;//成员数据内容
	PNODE pHead = (PNODE)malloc(sizeof(NODE));//创建头指针
	if (NULL == pHead)//判断是否头指针创建成功
	{
		printf("创建链表头结点失败\n");
		exit(-1);
	}
	printf("请输入链表长度 len = ");
	scanf("%d", &len);
	PNODE pTail = pHead;//生成一个尾结点
	pTail->next = NULL;

	for (int i = 0; i < len; i++)
	{
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if (pNew->next == NULL)
		{
			printf("分配内存失败\n");
			exit(-1);
		}
		printf("请输入要插入链表的值 val =");
		scanf("%d",&val);
		pNew->data = val;
		pTail->next = pNew;//将新结点挂在尾结点上
		pNew->next = NULL;
		pTail = pNew;//将新结点变成尾结点
	}
	return pHead;//将生成的链表的头结点地址返回
}

遍历链表

void traverse_list(PNODE pHead)//链表的遍历
{
	PNODE p = pHead->next;//将头指针的指针域赋值给新的结点
	while (p != NULL)//当该结点的next域不为空,就一直循环
	{
		printf("%d ", p->data);//输出数据域
		p = p->next;//将下一个结点的指针域赋值到当前指针
	}
	printf("\n");
	return;
}

判断链表是否为空

int is_empty(PNODE pHead) //判断链表是否为空
{

	if (NULL == pHead->next)
	{
		return 0;
	}
	else
	{		
		return 1;
	}

}

判断链表的长度

int list_length(PNODE pHead)
{
	int len = 0;
	PNODE p = pHead->next;
	while (p != NULL)//遍历每一个结点,循环一个长度加一
	{
		len++;
		p = p->next;
	}
	return len;
}

插入结点

void insert_list(PNODE pHead,int pos,int val)//在链表的指定位置增加指定数字
{
	int i = 0;
	PNODE p = pHead;//创建新的临时结点
	while (p != NULL && i < pos-1)//先循环找到插入点前一个结点
	{
		p = p->next;
		i++;
	}
	if (p == NULL || i > pos-1)//如果链表为空,或者指定插入点不存在即推出程序
	{
		return 0;
	}
	PNODE pNew = (PNODE)malloc(sizeof(NODE));//分配一个新的结点
	if (pNew == NULL)//判断分配内存给新的结点是否成功
	{
		printf("动态内存分配失败\n");
		exit (-1);
	}
	printf("输入新的结点的数据 val = ");
	scanf("%d",&val);
	pNew->data = val;
	//将插入点前的指针域保存在临时的结点q处
	PNODE q = p->next;
	//将要插入的结点的地址赋值给插入点前的指针域(即完成前一个指针指向新结点)
	p->next = pNew;
	//将临时保存的指针域赋值给插入的结点的指针域(即完成了插入结点指向插入点后结点)
	pNew->next = q;
	return 1;
}

链表的删除

//链表的删除与插入有相同之处
int dele_list(PNODE pHead, int pos, int* val)//在链表的指定位置删除数据
{
	int i = 0;
	PNODE p = pHead;
	while (p->next != NULL && i < pos - 1)//先循环找到链表的最后一个
	{
		p = p->next;
		i++;
	}
	if (p->next == NULL || i > pos - 1)
	{
		return 0;
	}
	PNODE qNew = p->next;
	*val = qNew->data;
	
	p->next = p->next->next;
	free(qNew);//释放删除结点的内存
	qNew = NULL;
	return 1;
}

链表排序

void sort_list(PNODE pHead)
{
	int i, j,t;
	PNODE p, q;
//冒泡排序
	int len = list_length(pHead);
	for (i = 0, p = pHead->next; i < len - 1; i++, p = p->next)
	{	
		for (j = i + 1, q = p->next; j < len; j++, q = q->next)
		{
			if (p->data > q->data)
			{
				t = p->data;
				p->data = q->data;
				q->data = t;
			}
		}
	}
	return;
}

代码整合实现


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

typedef struct Node//创建一个结构体类型
{
	int data;//数据域
	struct Node* next;
}NODE, * PNODE;

PNODE create_list(void);//创建链表
void traverse_list(PNODE pHead);//遍历链表
int is_empty(PNODE pHead);//判断链表是否为空
int	list_length(PNODE pHead);//返回链表的长度
void insert_list(PNODE pHead,int,int);//在链表的指定地方插入数据
void sort_list(PNODE pHead);//链表排序
int dele_list(PNODE pHead, int pos, int* val);//链表删除



int main()
{
	PNODE pHead = NULL;//定义头结点指针
	int val;
	pHead = create_list();
	traverse_list(pHead);
	if (is_empty(pHead)) 
	{
		printf("链表不为空\n");
	}
	else
	{
		printf("链表为空\n");
	}
	printf("链表的长度为 len = %d\n",list_length(pHead));
	sort_list(pHead);//链表排序
	traverse_list(pHead);
	insert_list(pHead, 3, 4);
	traverse_list(pHead);
	if (dele_list(pHead, 2, &val))
	{
		printf("删除成功,删除的元素是 val = %d \n",val);
	}
	else
	{
		printf("删除失败\n");
	}
	sort_list(pHead);
	traverse_list(pHead);
}
PNODE create_list()
{
	int len;//链表成员个数
	int i;
	int val;//成员数据
	PNODE	pHead = (PNODE)malloc(sizeof(NODE));//创建头指针
	if (NULL == pHead)
	{
		printf("创建链表头结点失败\n");
		exit(-1);
	}
	printf("请输入链表长度 len = ");
	scanf_s("%d", &len);
	PNODE pTail = pHead;
	pTail->next = NULL;

	for (int i = 0; i < len; i++)
	{
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if (pNew->next == NULL)
		{
			printf("分配内存失败\n");
			exit(-1);
		}
		printf("请输入要插入链表的值 val =");
		scanf_s("%d",&val);
		pNew->data = val;
		pTail->next = pNew;
		pNew->next = NULL;
		pTail = pNew;
	}
	return pHead;
}



void traverse_list(PNODE pHead)
{
	PNODE p = pHead->next;
	while (p != NULL)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
	return;
}
int is_empty(PNODE pHead) 
{

	if (NULL == pHead->next)
	{
		return 0;
	}
	else
	{		
		return 1;
	}

}

int list_length(PNODE pHead)
{
	int len = 0;
	PNODE p = pHead->next;
	while (p != NULL)
	{
		len++;
		p = p->next;
	}
	return len;



}



void insert_list(PNODE pHead,int pos,int val)//在链表的指定位置增加指定数字
{
	int i=0;
	PNODE p = pHead;
	while (p != NULL && i < pos-1)//先循环找到链表的最后一个
	{
		p = p->next;
		i++;
	}
	if (p == NULL || i > pos-1)
	{
		return 0;
	}
	PNODE pNew = (PNODE)malloc(sizeof(NODE));//分配一个新的结点
	if (pNew == NULL)
	{
		printf("动态内存分配失败\n");
		exit (-1);
	}
	printf("输入新的结点的数据 val = ");
	scanf_s("%d",&val);
	pNew->data = val;

	PNODE q = p->next;
	p->next = pNew;
	pNew->next = q;
	return 1;
}



int dele_list(PNODE pHead, int pos, int* val)//在链表的指定位置删除数据
{
	int i = 0;
	PNODE p = pHead;
	while (p->next != NULL && i < pos - 1)//先循环找到链表的最后一个
	{
		p = p->next;
		i++;
	}
	if (p->next == NULL || i > pos - 1)
	{
		return 0;
	}
	PNODE qNew = p->next;
	*val = qNew->data;

	p->next = p->next->next;
	free(qNew);
	qNew = NULL;
	return 1;
}


void sort_list(PNODE pHead)
{
	int i, j,t;
	PNODE p, q;

	int len = list_length(pHead);
	for (i = 0, p = pHead->next; i < len - 1; i++, p = p->next)
	{	
		for (j = i + 1, q = p->next; j < len; j++, q = q->next)
		{
			if (p->data > q->data)
			{
				t = p->data;
				p->data = q->data;
				q->data = t;
			}
		}
	}
	return;

}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值