数据结构 线性表链式存储 链表 C语言

实现链表的初始化、创建、查找、插入、删除、计算长度算法。
数据结构中的数据元素的类型为ElemType,通过typedef或define为ElemType指定具体的数据类型。

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef int Status;
#define OVERFLOW 0
#define ERROR 0
#define OK 1
//author: 小柳学渣
typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;

/*查找*/
Status GetElem_L(LinkList &L, int i, ElemType &e)
{
	LNode *p;
	int j;
	p = L->next;
	j = 1;
	while (p&&j < i)
	{
		p = p->next;
		++j;
	}
	if (!p||j > i)
	{
		printf("i值不合法");
		return ERROR;
	}
	e = p->data;
	printf("元素为:%d", e);
	return OK;
}

/*插入*/
Status ListInsert_L(LinkList &L, int i, ElemType e)
{
	LNode *p, *s;
	int j;
	p = L;
	j = 0;
	while (p&&j < i - 1)
	{
		p = p->next;
		++j;
	}
	if (!p||j > i - 1)
	{
		printf("i值不合法");
		return ERROR;
	}
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	printf("插入成功");
	return OK;
}

/*删除*/
Status ListDelete_L(LinkList &L, int i, ElemType &e)
{
	LNode *p, *q;
	int j;
	p = L;
	j = 0;
	while (p->next&&j < i - 1)
	{
		p = p->next;
		++j;
	}
	if (!(p->next) || j > i - 1)
	{
		printf("i值不合法");
		return ERROR;
	}
	q = p->next;
	p->next = q->next;
	e = q->data;
	free(q);
	printf("删除成功");
	return OK;
}

/*创建*/
void CreateList_L(LinkList &L, int n)
{
	LNode *p;
	int i;
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	for (i = n; i > 0; --i)
	{
		p = (LinkList)malloc(sizeof(LNode));
		scanf_s("%d", &p->data);
		p->next = L->next;
		L->next = p;
	}
}

/*重置*/
void ClearList_L(LinkList &L)
{
	LNode *p;
	while (L->next)
	{
		p = L->next;
		L->next = p->next;
		free(p);
	}
}

/*遍历*/
void ListTraverse(LinkList &L)
{
	LNode *p;
	p = L->next;
	while (p != NULL)
	{
		printf("%d\t", p->data);
		p = p->next;
	}
}

/*检查是否为空*/
void ListEmpty(LinkList &L)
{
	if (L->next == NULL)
		printf("链表为空\n");
	else
		printf("链表不为空\n");
}

/*初始化单链表*/
LinkList LinkListInit()
{
	LinkList L;
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	printf("初始化单链表成功\n");
	return L;//返回该单链表
}

/*长度*/
int LinkListLength(LinkList &L)
{
	LinkList p;
	int j;
	p = L->next;
	j = 0;
	while (p != NULL)
	{
		j++;
		p = p->next;
	}
	return j;
}
//author: 小柳学渣
int main()
{
	LinkList a;
	printf("************************************************\n");
	printf("*链表操作                                      *\n");
	printf("************************************************\n");
	printf("*请选择                                        *\n");
	printf("*1、创建链表                                   *\n");
	printf("*2、遍历链表                                   *\n");
	printf("*3、从链表中查找元素                           *\n");
	printf("*4、从链表中插入元素                           *\n");
	printf("*5、从链表中删除元素                           *\n");
	printf("*6、检查链表是否为空                           *\n");
	printf("*7、初始化链表                                 *\n");
	printf("*8、求链表长度                                 *\n");
	printf("*0、退出系统                                   *\n");
	printf("************************************************\n");

	int n = 0, k = 0, e, i;
	while (1)
	{
		printf("\n\n请输入选项");
		scanf_s("%d", &n);
		switch (n)
		{
		case 1:printf("请输入要添加元素的个数:");
			scanf_s("%d", &k);
			printf("请输入%d个数(反序):\n", k);
			CreateList_L(a, k);
			break;
		case 2:ListTraverse(a);break;
		case 3:printf("请输入要查找元素的位置:");
			scanf_s("%d", &i);
			GetElem_L(a, i, e);
			break;
        case 4:printf("请输入要插入元素的位置:");
			scanf_s("%d", &i);
			printf("请输入要插入的元素:");
			scanf_s("%d", &e);
			ListInsert_L(a, i, e);
			break;
		case 5:printf("请输入要删除元素的位置:");
			scanf_s("%d", &i);
			ListDelete_L(a, i, e);
			break;
		case 6:ListEmpty(a);break;
		case 7:a = LinkListInit();break;
		case 8:printf("链表的长度为:%d\n", LinkListLength(a));break;
		case 0:exit(0); break;
		default:printf("没有这个选项\n"); break;
		}
	}
}

C中的动态分配与释放函数(malloc, free)

猜你喜欢

转载自blog.csdn.net/l503301397/article/details/86676835
今日推荐