一:实现内容
本次练习主要实现链表的以下功能:
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问题