C语言(数据结构)链表练习(1)

一:实现内容

本次练习主要实现链表的以下功能:

1.头插法

2.尾插法

3.中间插入

4.中间自定义长度插入

5.透删法

6.尾删法

7.搜索

8.指定区间搜索

9.指定内容删除

​​​​​​​二:代码部分

.h头文件部分(函数声明,结构体创建等)

#pragma once
#ifndef _SEQLIST_H
typedef int ElemType;
#define MAX 10
enum Status{False,True,Overflow,ErrPara};
typedef struct SeqList
{
	ElemType _elements[MAX];
	int _size;
}SeqList;
void init(SeqList* plist);
Status InsertHead(SeqList* plist, ElemType val);
Status RecInsertHead(SeqList* plist, ElemType val);
Status InsertTail(SeqList* plist, ElemType val);
Status InsertPos(SeqList* plist, int pos, ElemType val);
Status InsertNumValPos(SeqList* plist, int pos, int num, ElemType val);
Status DeleteHead(SeqList* plist);
Status DeleteTail(SeqList* plist);
Status DeleteVal(SeqList* plist, ElemType val);//删除所有val
int* SearchByVal(SeqList* plist, ElemType val);//返回下标
ElemType* SearchValOfRange(SeqList* plist, int begin, int end, ElemType val);//范围内查找返回指针
void Show(SeqList* plist);
#endif

源.cpp文件(函数的实现)

#include  "sjjg01.h"
#include <cassert>
#include <string.h>
#include<stdio.h>
#include<stdlib.h>
int* arr = (int*)malloc(10*sizeof(int));
static bool IsFull(SeqList* plist)
{
	return plist->_size == MAX;
}
void init(SeqList* plist)
{
	assert(plist != NULL);
	if (plist == NULL) { return; }
	plist->_size = 0;//有效个数
}
Status InsertHead(SeqList* plist, ElemType val) 
{
	assert(plist != NULL);
	assert(plist->_size != 10);
	for (int i = plist->_size ; i >0 ; i--)
	{
		plist->_elements[i] = plist->_elements[i-1];
	}
//	memcpy(plist->_elements+1,plist->_elements,plist->_size*sizeof(ElemType));
	plist->_size++;
	plist->_elements[0] = val;
	return True;
}
Status InsertTail(SeqList* plist, ElemType val)
{
	if (plist->_size == MAX)return Overflow;
	plist->_elements[plist->_size++] = val;
	return True;
}
Status InsertPos(SeqList* plist, int pos, ElemType val)
{
	assert(plist&&pos>0);
	if (pos > plist->_size) { return InsertTail(plist, val); }
	for (int i = plist->_size; i > pos; i--)
	{
		plist->_elements[i] = plist->_elements[i - 1];
	}
	//	memcpy(plist->_elements+1,plist->_elements,plist->_size*sizeof(ElemType));
	plist->_size++;
	plist->_elements[pos] = val;
	return True;
}
/*RecInsertHead0(ElemType* data, int index, ElemType val)
{
	assert(data!=NULL);
	if (index == -1)
	{
		data[0] = val;
		return True;
	}
	data[index + 1] = data[index];
	return	RecInsertHead0(data, index - 1,val);
}
Status RecInsertHead(SeqList* plist, ElemType val)
{
	if (plist->_size == MAX)return Overflow;
	return RecInsertHead0(plist->_elements,plist->_size-1,val);
}*/
Status InsertNumValPos(SeqList* plist, int pos, int num, ElemType val)
{
	assert(plist && pos);
	if (plist->_size + num > MAX)return Overflow;
	for(int i=0;i<num;i++)
	{
		for (int i = plist->_size; i > pos; i--)
		{
			plist->_elements[i] = plist->_elements[i - 1];
		}
		plist->_size++;
		plist->_elements[pos] = val;
	}
}
Status DeleteHead(SeqList* plist)
{
	assert(plist);
	for(int i=0;i<plist->_size-1;i++)
	{
		plist->_elements[i] = plist->_elements[i+1];
	}
	plist->_size--;
	return True;
}
Status DeleteTail(SeqList* plist)
{
	assert(plist);
	plist->_elements[plist->_size]=0;
	plist->_size--;
	return True;
}
Status DeleteVal(SeqList* plist, ElemType val)
{
	assert(plist);
	for(int i=0;i<plist->_size;i++)//若循环只运行到 plist->_size - 1,这意味着如果最后一个元素是 val,则它不会被检查。
	{
			if (plist->_elements[i] == val)
			{
				plist->_elements[i] = plist->_elements[i + 1];
				plist->_size--;
				i--;
			}
	}
	return True;
}
int* SearchByVal(SeqList* plist, ElemType val)
{
	assert(plist);
	for (int i = 0; i < plist->_size; i++)//若循环只运行到 plist->_size - 1,这意味着如果最后一个元素是 val,则它不会被检查。
	{
		int n = 0;
		if (plist->_elements[i] == val)
		{
	
			arr[n] = i;
			n++;
			printf("下标:%d为目标值", arr[n-1]+1);
		}
	}
	printf("\n");
	return arr;
	free(arr);
}
ElemType* SearchValOfRange(SeqList* plist, int begin, int end, ElemType val)
{
	assert(plist);
	int n = 1;
	if(begin<0||end>plist->_size)
	{
		printf("输入错误\n");
		exit(2);
	}
	for (int i = begin+1; i <end+1; i++)
	{

		if (plist->_elements[i] == val)
		{
			n++;
		}
	}
	printf("%d个附和要求\n",n);
	return arr;
	free(arr);
}
void Show(SeqList* plist)
{
	for (int i = 0; i < plist->_size; i++)
	{
		printf("%-3d", plist->_elements[i]);
	}
	printf("\n");
}

源.cpp文件(main函数):

#include "sjjg01.h"//此处引用前方的源文件会由函数重定义的错误
#include<stdio.h>
#include<stdlib.h>
int main()
{
	SeqList list;//list属性:数组+size
	init(&list);
	for  (int i = 0;  i < 3;  i++)
	{
		InsertHead(&list, i + 1);
	}
	Show(&list);
	InsertNumValPos(&list, 2, 5, 6);
	Show(&list);
	DeleteHead(&list);
	Show(&list);
	DeleteTail(&list);
	Show(&list);
	DeleteVal(&list, 6);
	Show(&list);
	InsertNumValPos(&list, 2, 5, 6);
	Show(&list);
	SearchByVal(&list,6);
	SearchValOfRange(&list,1, 5, 6);
}

注意点:malloc的free问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值