线性表的链式存储结构

(1)​ 用头插法或尾插法建立带头结点单链表

(2)​ 实现单链表的插入、删除、查找、遍历、排序等基本操作

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
	int data;//数据域
	struct Node* pNext;//指针域
}NODE,*PNODE;//NODE等价于struct Node,*PNODE 等价于struct Node *

PNODE creat_list();//创建单链表,并返回该链表的头指针
void traverse_list(PNODE pHead);//遍历单链表
int is_empty(PNODE pHead);//判读单链表是否为空
int insert_list(PNODE pHead, int pos, int val);
//在pHead所指向的第pos个节点的前面插入一个新节点,值(数据域)为val,并且pos从1开始
PNODE create_list_head();//头插法
int delete_list(PNODE pHead, int pos, int* pVal);
//删除链表的第pos个节点,并将删除的节点的值存到pVal所指的变量中,pos的值从1开始
int length_list(PNODE pHead);//求表长度
void sort_list(PNODE pHead);//排序

int main(void)
{
	int val = 0;//保存被删节点的数据值
	PNODE pHead = NULL;//定义头指针,等价于struct Node *pHead = NULL
	//创建单链表
	pHead=creat_list();
	//遍历链表
	traverse_list(pHead);
	insert_list(pHead, 2, 28);
	traverse_list(pHead);
	delete_list(pHead, 4, &val);
	printf("被删元素的值为:%d\n", val);
	traverse_list(pHead);
	printf("表长为:%d\n", length_list(pHead));
	sort_list(pHead);
	traverse_list(pHead);
}

PNODE creat_list()
{
	PNODE pNew;
	int len;//用来存放有效节点的个数
	int i;
	int val;
	PNODE pHead = (PNODE)malloc(sizeof(NODE));//向系统申请空间,表示头节点
	if (pHead == NULL)
	{
		printf("空间分配失败,程序终止!\n");
		exit(-1);
	}
	PNODE pTail = pHead;//尾指针,开始指向头节点
	pTail->pNext = NULL;
	printf("请输入要生成的链表节点个数:len= ");
	scanf_s("%d", &len);//获取用户输入的len值
	for (i = 0; i < len; i++)
	{
		printf("请输入第%d个节点的值:  ", i + 1);
		scanf_s("%d", &val);
		pNew = (PNODE)malloc(sizeof(NODE));//申请新节点,分配空间
		if (pNew == NULL)
		{
			printf("空间分配失败,程序终止\n");
			exit(-1);
		}
		pNew->data = val;
		pTail->pNext = pNew;//新节点挂到pTail的next域
		pNew->pNext = NULL;
		pTail = pNew;//使得pTail始终指向尾结点
	}
	return pHead;
}

void traverse_list(PNODE pHead)
{
	PNODE p = pHead->pNext;//p指向首节点(头节点的后面一个节点)
	while (p != NULL)
	{
		printf("%d  ", p->data);
		p = p->pNext;//顺链操作
	}
	printf("\n");
	return;

}

int is_empty(PNODE pHead)
{
	if (pHead->pNext == NULL)
		return 1;//1表示为空表
	else
		return 0;//0表示不是空表
}

int insert_list(PNODE pHead, int pos, int val)
{
	PNODE p = pHead;
	int i = 0;
	PNODE pNew;
	while (p != NULL && i < pos - 1)//循环结束时,p指向的是第pos-1个节点
	{
		p = p->pNext;
		i++;
	}
	if (i > pos - 1 || p == NULL)
		return 0;//0表示插入失败
	pNew = (PNODE)malloc(sizeof(NODE));//表示要插入的节点
	if (pNew == NULL)
	{
		printf("空间分配失败,程序终止!\n");
		exit(-1);
	}
	pNew->data = val;
	pNew->pNext = p->pNext;
	p->pNext = pNew;
	printf("插入成功!\n");
	return 1;//1表示插入成功
}

PNODE create_list_head()//头插法,逆序
{
	int len;
	int i;
	int val;
	PNODE p;
	PNODE pHead = (PNODE)malloc(sizeof(NODE));//向系统申请空间,表示头节点。
	if (pHead == NULL)
	{
		printf("空间分配失败,程序终止!\n");
		exit(-1);
	}
	pHead->pNext = NULL;
	printf("请输入要生成的链表节点的个数:len=");
	scanf_s("%d", &len);//获取用户输入的len的值
	for (i = len; i > 0; i--)
	{
		printf("请输入第%d个节点的值: ", i);
		scanf_s("%d", &val);
		p = (PNODE)malloc(sizeof(NODE));
		if (p == NULL)
		{
			printf("空间分配失败,程序终止!\n");
			exit(-1);
		}
		p->data = val;
		p->pNext = pHead->pNext;
		pHead->pNext = p;
	}
	return pHead;
}

int delete_list(PNODE pHead, int pos, int* pVal)
{
	int i = 0;
	PNODE p = pHead;
	PNODE q;//q记录被删节点
	while (p != NULL && i < pos - 1)//循环结束时,p指向的是第pos-1个节点
	{
		p = p->pNext;//顺链
		i++;
	}
	if (i > pos - 1 || p->pNext == NULL)
		return 0;//0表示删除失败
	q = p->pNext;
	*pVal = q->data;//保存被删除节点的数据域
	p->pNext = p->pNext ->pNext;
	free(q);
	return 1;//1表示删除成功
}

int length_list(PNODE pHead)//求表头(不算头节点)
{
	int len = 0;
	PNODE p = pHead->pNext;//p指向了首节点
	while (p != NULL)
	{
		len++;
		p = p->pNext;
	}
	return len;
}

void sort_list(PNODE pHead)
{
	int len = length_list(pHead);//求表长
	PNODE p, q;
	int j, t,i;
	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)
			{
				t = p->data;
				p->data = q->data;
				q->data = t;
			}
		}
	}
	return;
}#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
	int data;//数据域
	struct Node* pNext;//指针域
}NODE,*PNODE;//NODE等价于struct Node,*PNODE 等价于struct Node *

PNODE creat_list();//创建单链表,并返回该链表的头指针
void traverse_list(PNODE pHead);//遍历单链表
int is_empty(PNODE pHead);//判读单链表是否为空
int insert_list(PNODE pHead, int pos, int val);
//在pHead所指向的第pos个节点的前面插入一个新节点,值(数据域)为val,并且pos从1开始
PNODE create_list_head();//头插法
int delete_list(PNODE pHead, int pos, int* pVal);
//删除链表的第pos个节点,并将删除的节点的值存到pVal所指的变量中,pos的值从1开始
int length_list(PNODE pHead);//求表长度
void sort_list(PNODE pHead);//排序

int main(void)
{
	int val = 0;//保存被删节点的数据值
	PNODE pHead = NULL;//定义头指针,等价于struct Node *pHead = NULL
	//创建单链表
	pHead=creat_list();
	//遍历链表
	traverse_list(pHead);
	insert_list(pHead, 2, 28);
	traverse_list(pHead);
	delete_list(pHead, 4, &val);
	printf("被删元素的值为:%d\n", val);
	traverse_list(pHead);
	printf("表长为:%d\n", length_list(pHead));
	sort_list(pHead);
	traverse_list(pHead);
}

PNODE creat_list()
{
	PNODE pNew;
	int len;//用来存放有效节点的个数
	int i;
	int val;
	PNODE pHead = (PNODE)malloc(sizeof(NODE));//向系统申请空间,表示头节点
	if (pHead == NULL)
	{
		printf("空间分配失败,程序终止!\n");
		exit(-1);
	}
	PNODE pTail = pHead;//尾指针,开始指向头节点
	pTail->pNext = NULL;
	printf("请输入要生成的链表节点个数:len= ");
	scanf_s("%d", &len);//获取用户输入的len值
	for (i = 0; i < len; i++)
	{
		printf("请输入第%d个节点的值:  ", i + 1);
		scanf_s("%d", &val);
		pNew = (PNODE)malloc(sizeof(NODE));//申请新节点,分配空间
		if (pNew == NULL)
		{
			printf("空间分配失败,程序终止\n");
			exit(-1);
		}
		pNew->data = val;
		pTail->pNext = pNew;//新节点挂到pTail的next域
		pNew->pNext = NULL;
		pTail = pNew;//使得pTail始终指向尾结点
	}
	return pHead;
}

void traverse_list(PNODE pHead)
{
	PNODE p = pHead->pNext;//p指向首节点(头节点的后面一个节点)
	while (p != NULL)
	{
		printf("%d  ", p->data);
		p = p->pNext;//顺链操作
	}
	printf("\n");
	return;

}

int is_empty(PNODE pHead)
{
	if (pHead->pNext == NULL)
		return 1;//1表示为空表
	else
		return 0;//0表示不是空表
}

int insert_list(PNODE pHead, int pos, int val)
{
	PNODE p = pHead;
	int i = 0;
	PNODE pNew;
	while (p != NULL && i < pos - 1)//循环结束时,p指向的是第pos-1个节点
	{
		p = p->pNext;
		i++;
	}
	if (i > pos - 1 || p == NULL)
		return 0;//0表示插入失败
	pNew = (PNODE)malloc(sizeof(NODE));//表示要插入的节点
	if (pNew == NULL)
	{
		printf("空间分配失败,程序终止!\n");
		exit(-1);
	}
	pNew->data = val;
	pNew->pNext = p->pNext;
	p->pNext = pNew;
	printf("插入成功!\n");
	return 1;//1表示插入成功
}

PNODE create_list_head()//头插法,逆序
{
	int len;
	int i;
	int val;
	PNODE p;
	PNODE pHead = (PNODE)malloc(sizeof(NODE));//向系统申请空间,表示头节点。
	if (pHead == NULL)
	{
		printf("空间分配失败,程序终止!\n");
		exit(-1);
	}
	pHead->pNext = NULL;
	printf("请输入要生成的链表节点的个数:len=");
	scanf_s("%d", &len);//获取用户输入的len的值
	for (i = len; i > 0; i--)
	{
		printf("请输入第%d个节点的值: ", i);
		scanf_s("%d", &val);
		p = (PNODE)malloc(sizeof(NODE));
		if (p == NULL)
		{
			printf("空间分配失败,程序终止!\n");
			exit(-1);
		}
		p->data = val;
		p->pNext = pHead->pNext;
		pHead->pNext = p;
	}
	return pHead;
}

int delete_list(PNODE pHead, int pos, int* pVal)
{
	int i = 0;
	PNODE p = pHead;
	PNODE q;//q记录被删节点
	while (p != NULL && i < pos - 1)//循环结束时,p指向的是第pos-1个节点
	{
		p = p->pNext;//顺链
		i++;
	}
	if (i > pos - 1 || p->pNext == NULL)
		return 0;//0表示删除失败
	q = p->pNext;
	*pVal = q->data;//保存被删除节点的数据域
	p->pNext = p->pNext ->pNext;
	free(q);
	return 1;//1表示删除成功
}

int length_list(PNODE pHead)//求表头(不算头节点)
{
	int len = 0;
	PNODE p = pHead->pNext;//p指向了首节点
	while (p != NULL)
	{
		len++;
		p = p->pNext;
	}
	return len;
}

void sort_list(PNODE pHead)
{
	int len = length_list(pHead);//求表长
	PNODE p, q;
	int j, t,i;
	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)
			{
				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、付费专栏及课程。

余额充值