数据结构中链表的相关操作

功能说明

代码为单链表的相关操作,主要操作为头插法、尾插法建立单链表、查找节点、修改节点、插入节点、删除节点、打印链表数据等功能。代码由头文件(LinkList.h)、接口实现(LinkList.c)和测试文件(main.c)三部分组成。
LinkList.h

#ifndef __LINKLIST__
#define __LINKLIST__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#pragma warning(disable:4996)
typedef struct LNode{
	int  Data;
	struct LNode* Next;
}*LinkList,LNode;
//头插法建立单链表
LinkList CreateListF(LinkList L, int a[], int n);
//尾插法建立单链表
LinkList CreateListR(LinkList L, int a[], int n);
//查找节点
int SearchElem(LinkList L, int e);
//修改节点
LinkList Replace(LinkList L, int p, int e);
//插入节点
LinkList InsertElem(LinkList L, int p, int e);
//删除节点
LinkList DeleteElem(LinkList L, int p, int *e);
//打印链表数据
void PrintfList(LinkList L);
#endif

LinkList.c

#include "LinkList.h"
//头插法
LinkList CreateListF(LinkList L, int a[], int n)
{
	LNode *s = NULL;
	int i;
	L = (LinkList)malloc(sizeof(LNode));
	L->Next = NULL;
	for (i = 0; i < n; ++i)
	{
		s = (LNode*)malloc(sizeof(LNode));
		s->Data = a[i];
		s->Next = L->Next;
		L->Next = s;
	}
	return L;
}
//尾插法
LinkList CreateListR(LinkList L, int a[], int n)
{
	LNode *s = NULL, *r= NULL;
	int i;
	L = (LinkList)malloc(sizeof(LNode));
	L->Next = NULL;
	r = L;
	for (i = 0; i < n; ++i)
	{
		s = (LNode*)malloc(sizeof(LNode));
		s->Data = a[i];
		r->Next = s;
		r = s;
	}
	r->Next = NULL;
	return L;
}
//查找节点
int SearchElem(LinkList L, int e)
{
	LNode* temp = L;
	int i = 1, p = 0;
	while (temp->Next)
	{
		temp = temp->Next;
		if (temp->Data == e)
		{
			p = i;
			printf("找到了与%d相等的元素,位置为%d\n", e, p);
			return 1;
		}
		++i;
	}
	printf("抱歉,没有找到所需要的元素!!!\n");
	return -1;
}
//修改节点
LinkList Replace(LinkList L, int p, int e)
{
	if (L == NULL)
	{
		return NULL;
	}
	LNode* temp = L;
	int i;
	temp = temp->Next;
	for (i = 1; i < p; i++)
	{
		temp = temp->Next;
	}
	temp->Data = e;
	return L;
}
//插入节点
LinkList InsertElem(LinkList L, int p, int e)
{
	if (L == NULL)
	{
		return NULL;
	}
	LNode * temp = L,*s = NULL;
	int i = 0;
	while (i < p - 1)
	{
		temp = temp->Next;
		++i;
	}
	s = (LNode*)malloc(sizeof(LNode));
	s->Data = e;
	s->Next = temp->Next;
	temp->Next = s;
	return L;
}
//删除节点
LinkList DeleteElem(LinkList L, int p, int *e)
{
	if (L == NULL)
	{
		return NULL;
	}
	LNode* temp = L,*q = NULL;
	int i = 0;
	while (i < p - 1)
	{
		temp = temp->Next;
		++i;
	}
	q = temp->Next;
	*e = q->Data;
	temp->Next = q->Next;
	free(q);
	return L;
}
void PrintfList(LinkList L)
{
	LNode* temp = L;
	int count = 0;
	printf("表中的元素为:\n");
	while (temp->Next)
	{
		temp = temp->Next;
		printf("%d\t", temp->Data);
		count++;
		if (count % 5 == 0)
		{
			printf("\n");
		}
	}
	printf("\n");
}

main.c

#include "LinkList.h"
int main(int argc, const char* argv[])
{
	LinkList L =  NULL;
	int n,i;
	printf("请输入数组的个数: ");
	scanf("%d", &n);
	int *a = (int *)malloc(sizeof(int)*n);
	printf("请输入数组中的数(用空格分开): ");
	for (i = 0; i < n; ++i)
	{
		scanf("%d", &a[i]);
	}
	L = CreateListF(L, a, n);
	PrintfList(L);
	int e;
	printf("请输入要查找的结点: ");
	scanf("%d", &e);
	SearchElem(L, e);
	int p, k;
	printf("请输入要修改的位置和更改后的元素值(用,进行分割):");
	scanf("%d,%d", &p, &k);
	L = Replace(L, p, k);
	PrintfList(L);
	printf("请输入要插入的位置和元素值(用,进行分割):");
	scanf("%d,%d", &p, &k);
	L = InsertElem(L, p, k);
	PrintfList(L);
	printf("请输入要删除结点的位置:");
	scanf("%d,%d", &p);
	L = DeleteElem(L, p, &k);
	PrintfList(L);
	system("pause");
	return 0;
}

运行结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值