链表顺序表的实现数据结构

基础项目

<1>创建一个空链表;

<2>用尾插法通过键盘输入创建一个含有若干结点的非空链表(可以在创建函数中通过调用插入函数新建/插入一个个结点);

<3>输出单链表各结点;

<4>查找第i个位置上的结点,并将结点值输出;

<5>在单链表head中第i个位置上插入元素值为x的新结点;

<6>判断单链表是否为空;

<7>删除第i个位置上的结点;

<8>删除整个单链表。

拓展项目:

<1>对已有链表按结点数据值大小进行递增排序。排序后,在该链表中插入一个值为85的元素,并保持其递增有序特性。函数名:sortlist( );

<2>请为所有操作添加选择菜单。

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

typedef int datatype;
typedef struct node
{
	datatype data;
	struct node* next;
}linklist;
typedef linklist* List;

/*创建一个空链表,返回指向链表的指针*/
linklist* creatList();
/*创建一个非空链表(按尾插法创建),返回指向链表的指针*/
linklist* creatList1();
/*在单链表head中p结点之后插入元素X为新结点*/
void insertXtoList(linklist* head, linklist* p, datatype x);
/*按从前向后的顺序显示链表中的元素值*/
void displaylist(linklist* head);
/*在某个位置插入一个新结点*/
linklist* Insert(linklist* head, int i, datatype x);
/*判断链表head是否为空,为空返回1,否则返回0*/
int isEmpty(linklist* head);
/*查找第i个位置上的元素结点并返回*/
linklist* locateItem(linklist* head, int Index);
/*删除第i个位置上的元素结点*/
linklist* Delete(linklist* head, int i);
/*删除链表,即删除所有结点*/
void deleteList(linklist* head);
/*将单链表head置空*/
linklist* setnull(linklist* head);

int main()
{
	//空表创建及判断
	List head_NULL = creatList();
	displaylist(head_NULL);

	//尾插法创建表
	List head1 = creatList1();
	displaylist(head1);
	//查询操作
	int i;
	datatype e;
	printf("请输入您需要查找的数据元素的结点位置:");
	scanf_s("%d", &i);
	printf("第%d个结点上的数据为:%d\n", i, locateItem(head1, i)->data);
	//删除操作
	printf("请问您需要删除第几个元素?\n");
	scanf_s("%d", &i);
	displaylist(Delete(head1, i));
	//插入操作
	printf("请输入您需要插入的位置和数据:\n");
	scanf_s("%d%d", &i, &e);
	displaylist(Insert(head1, i, e));
	//传入结点地址在其后插入新的数据
	printf("请输入您要插入的位置和数据:\n");
	scanf_s("%d%d", &i, &e);
	insertXtoList(head1, locateItem(head1, i), e);
	displaylist(head1);
	return 0;
}

/*创建一个空链表,返回指向链表的指针*/
linklist* creatList()
{
	List head = (List)malloc(sizeof(linklist));
	if (head != NULL) {
		head->next = NULL;
		head->data = 0;
	}
	return head;
}

/*将单链表head置空*/
linklist* setnull(linklist* head)
{
	List t;
	t = head->next;	//t为链表中第一个结点的地址
	head->next = NULL;
	return t;
}

/*创建一个非空链表(按尾插法创建),返回指向链表的指针*/
linklist* creatList1()
{
	List head, p, s;
	int n;
	datatype data;
	printf("请问,您需要输入几个数据?\n");
	scanf_s("%d", &n);
	if (n <= 0) {
		printf("数据个数不合理,创建失败!\n");
		return NULL;
	}
	head = (List)malloc(sizeof(linklist));
	if (head != NULL) {
		/*下面这段代码通过调用插入函数实现尾插法建表
		head->next = NULL;
		head->data = 0;
		for (int i = 0; i < n; i++) {
			printf("请输入第%d个数据:", i + 1);
			scanf_s("%d", &data);
			Insert(head, i + 1, data);
			head->data++;
		}*/
		//正常的尾插法建表
		head->data = 0;
		s = head;
		for (int i = 0; i < n; i++) {
			p = (linklist*)malloc(sizeof(linklist));
			if (p != NULL) {
				printf("请输入第%d个数据:", i + 1);
				scanf_s("%d", &p->data);
				s->next = p;
				s = p;
				head->data++;
			}
		}
		s->next = NULL;
		return head;
	}
}

/*按从前向后的顺序显示链表中的元素值*/
void displaylist(linklist* head)
{
	List p;
	p = head->next;
	if (isEmpty(head)) {
		printf("该表为空表!\n**********\n\n");
		return;
	}
	while (p != NULL)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n该表长为:%d", head->data);
	printf("\n**********\n\n");
}

/*在某个位置上插入一个新结点*/
linklist* Insert(linklist* head, int i, datatype x)
{
	List p, t;
	//找到第i-1个结点------调用查找结点的函数(函数的嵌套调用)
	p = locateItem(head, i - 1);
	t = (List)malloc(sizeof(linklist));
	if (t != NULL) {
		t->data = x;
		t->next = p->next;
		p->next = t;
		head->data++;
	}
	return head;
}

/*删除某个位置上的结点*/
linklist* Delete(linklist* head, int i)
{
	List p, s;
	//查找到第i-1个结点
	p = locateItem(head, i - 1);
	s = p->next;
	p->next = s->next;
	free(s);
	head->data--;
	return head;
}

/*判断链表head是否为空,为空返回1,否则返回0*/
int isEmpty(linklist* head)
{
	if (head->next == NULL) {
		return 1;
	}
	return 0;
}

/*查找第i个位置上的元素结点并返回*/
linklist* locateItem(linklist* head, int Index)
{
	List p;
	p = head;
	for (int k = 0; k < Index; k++) {
		p = p->next;
	}
	return p;
}

/*删除链表,即删除所有结点*/
void deleteList(linklist* head)
{
	List p, s;
	p = head;
	while (p != NULL)
	{
		s = p->next;
		free(p);
		p = s;
	}
	free(p);
}

/*在单链表head中p结点之后插入元素X为新结点*/
void insertXtoList(linklist* head, linklist* p, datatype x) {
	List t, s;
	t = head;
	while (t->next != p && t != NULL) {
		t = t->next;
	}
	if (t == NULL) {
		printf("插入位置的前一个结点不存在!\n");
		return;
	}
	s = (List)malloc(sizeof(linklist));
	if (s != NULL) {
		s->data = x;
		s->next = t->next;
		t->next = s;
		head->data++;
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

惑星撞地球

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

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

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

打赏作者

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

抵扣说明:

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

余额充值