线性表的链式结构实现

				/* 6 线性表的链式结构实现 */

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

typedef int TYPE;//定义数据类型别名

//声明结点结构体
typedef struct Node
{
	TYPE data;//存储结点数据
	struct Node* next;//指向下一节点
}Node;

//声明链表结构体
typedef struct
{
	Node* head;//头指针
	int length;//链表长度
}lineList;

/*对单链表的操作*/
bool init(lineList* list);//链表初始化

bool input(lineList* list,int pos,TYPE elem);//插入操作

/*因为使用了c++编译器,所以在delete后面加了1*/
TYPE delete1(lineList* list,int pos);//删除操作

int length(lineList* list);//链表长度

void traverse(lineList* list);//遍历操作

int search(lineList* list,TYPE elem);//查询指定元素的位置

void clear(lineList* list);//链表清空

void destroy(lineList* list);//销毁链表

int main()
{
	lineList list;
	//初始化测试
	bool flag=init(&list);
	if(flag)
		printf("初始化成功!\n");
	else
		printf("初始化失败!\n");
	
	for(int i=0;i<6;i++)	//循环测试6次
	{	
		//插入操作测试
		printf("输入插入的位置:");
		int pos=0;
		scanf("%d",&pos);
		printf("输入插入的数值:");
		TYPE elem=0;
		scanf("%d",&elem);
		flag=input(&list,pos,elem);
		if(flag)
			printf("插入成功!\n");
		else
			printf("插入位置不合法,插入失败!\n");
		
		
		//遍历操作测试
		printf("遍历链表:");
		traverse(&list);
		//链表长度测试
		printf("链表的长度为:%d\n",length(&list));
		
		//搜索链表
		printf("输入要搜素的元素:");
		scanf("%d",&elem);
		pos=search(&list,elem);
		if(pos!=-1)
			printf("元素%d在链表的第%d个位置\n",elem,pos);
		else
			printf("不存在,查找失败!\n");
		
		//删除操作测试
		printf("输入要删除的位置:");
		scanf("%d",&pos);
		elem=delete1(&list,pos);
		if(elem!=-1)
			printf("删除的元素是:%d\n",elem);
		else
			printf("删除位置不合法或者链表已空,删除失败!\n");
		printf("删除后遍历链表:");
		traverse(&list);
		printf("删除后链表的长度为:%d\n",length(&list));
	}
	
	//清空链表
	clear(&list);
	printf("清空后遍历链表:");
	traverse(&list);
	
	//销毁链表
	destroy(&list);
	return 0;
}

//链表初始化
bool init(lineList* list)
{
	Node* p=(Node*)malloc(sizeof(struct Node));
	if(p)
	{
		p->next=NULL;
		list->head=p;
		list->length=0;
		return true;
	}
	else
		return false;
}

//插入操作
bool input(lineList* list,int pos,TYPE elem)
{
	if(pos>0&&pos<=length(list)+1)
	{
		Node* p=(Node*)malloc(sizeof(struct Node));
		if(p)
		{
			p->data=elem;
			Node* q=list->head;
			for(int i=1;i<pos;i++)
			{
				q=q->next;
			}
			p->next=q->next;
			q->next=p;
			list->length++;
			return true;
		}
		else 
			return false;
	}
	else
		return false;
}

//删除操作
TYPE delete1(lineList* list,int pos)
{
	if(0!=length(list)&&pos>0&&pos<=length(list))
	{
		Node* p=list->head;
		for(int i=1;i<pos;i++)
		{
			p=p->next;
		}
		Node* q=p->next;
		TYPE elem=q->data;
		p->next=p->next->next;
		free(q);
		q=NULL;
		list->length--;
		return elem;
	}
	else
		return -1;//返回-1代表删除失败
}

//链表长度
int length(lineList* list)
{
	return list->length;
}

//遍历链表
void traverse(lineList* list)
{
	Node* p=list->head->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

//搜索链表
int search(lineList* list,TYPE elem)
{
	Node* p=list->head->next;
	int pos=0;
	while(p)
	{
		if(p->data==elem)
		{
			break;
		}
		else
		{
			pos++;
			p=p->next;
		}
	}
	if(pos==length(list))
		return -1;
	else
		return pos+1;
}

//清空链表
void clear(lineList* list)
{
	destroy(list);
	init(list);
}

//销毁链表
void destroy(lineList* list)
{
		Node* p=list->head->next;
		while(length(list))
		{
			Node* q=p;
			p=p->next;
			free(q);
			q=NULL;
			list->length--;
		}
		free(list->head);
		list->head=NULL;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦时小

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值