数据结构与算法-4-链表的基本操作-增
注意:以下为顺序存储结构实现
- 相关的头文件
/*以下为头文件SqList.h是用于定义相关函数的头文件*/
#pragma once
#define LIST_INIT_SIZE 100/*初始线性表的尺寸大小为100*/
#define LIST_INCREAMENT 10/*每次增量为10*/
typedef enum {
success,fatal,fail,range_error
}Status;/*状态参量的定义*/
typedef int ElemType;
typedef struct SqList
{
ElemType* elem;/*数据*/
int length;/*顺序链表的长度*/
int list_size;/*该顺序链表所占的总空间大小*/
}SqList,*Ptr,*SqListPtr;
Status List_Init(SqListPtr L);/*对线性表初始化*/
void List_Destory(SqListPtr L);/*归还线性表*/
void List_Clear(SqListPtr L);/*清空线性表*/
Status List_Retrival(SqListPtr L,int pos,ElemType *elem);/*查找某元素位置*/
Status List_Locate(SqListPtr L,ElemType elem,int *pos);/*插入元素*/
void List_Print(SqListPtr L);/*打印函数*/
/*以下为头文件TestSqlist.h是用于测试的头文件*/
#pragma once
#include"Sqlist.h"
Status Test_CreateList(SqListPtr list,ElemType data[],int n);
Status Test_ClearList(SqListPtr list);
2.相关的C文件
/*是Sqlist.c用于测试Sqlist.h中的函数*/
#include<stdio.h>
#include<stdlib.h>
#include"Sqlist.h"
Status List_Init(SqListPtr L)
{
Status s = fail;
if (L!=NULL)
{
L->elem = (ElemType*)malloc((LIST_INIT_SIZE+1) * sizeof(ElemType));/*给线性表分配空间*/
if (L->elem)
{
L->list_size = LIST_INIT_SIZE;/*分配成功则线性表的总空间大小为100*/
L->length = 0;/*初期元素个数为零*/
s = success;
}
}
return s;
}
void List_Destory(SqListPtr L)
{
if (L)/*线性表存在*/
{
if (L->elem)/*这个空间存在*/
{
free(L->elem);
L->elem = NULL;
L->length = 0;
}
}
}
void List_Clear(SqListPtr L)
{
if (L)
{
L->length = 0;
}
}
bool List_Empty(SqListPtr L)
{
return (L->length == 0);
}
int List_size(SqListPtr L)
{
return L->length;
}
Status List_Insert(SqListPtr L, int pos, ElemType elem)
{
Status s = range_error;
int i;
if (L)
{
if (pos >= 1 && pos <= L->length+1)/*在最后一个元素后面插入也是可以的*/
{
if (L->length < L->list_size)/*线性表的长度小于所分配的空间即可插入*/
{
for (i = L->length; i >= pos; i--)
{
L->elem[i + 1] = L->elem[i];/*所有元素向后移动一位*/
}
L->elem[i+1] = elem;
L->length += 1;
s = success;
}
}
}
return s;
}
void List_Print(SqListPtr L)
{
int i;
if (L)
{
for (i = 1; i<=L->length; i++)
{
printf("%d ", L->elem[i]);
if (i % 10 == 0)
{
printf("\n");
}
}
}
}
/*是TestSqList.c用于测试TestSqList.h中的函数*/
#include<stdio.h>
#include<stdlib.h>
#include"TestSqList.h"
Status Test_CreateList(SqListPtr list, ElemType data[], int n)
{
Status s = fail;
s = List_Init(list);
int i;
if (s == success)
{
for (i = 1; i <= n; i++)
{
s = List_Insert(list, i, data[i]);
if (s != success)
{
break;
}
}
List_Print(list);
}
return s;
}
Status Test_ClearList(SqListPtr list)
{
Status s = fail;
if (!List_Empty(list))
{
List_Clear(list);
if (List_Empty(list))
{
s = success;
}
}
return s;
}
3.主函数的实现
#include<stdio.h>
#include<stdlib.h>
#include"TestSqList.h"
int main()
{
int opt=1;/*选项*/
SqListPtr list;
int pos, size,i;
Status s;
ElemType e, * data;
while (opt!=6) {
printf("请输入选项\n");
printf("1:测试建立线性表\n");
printf("2:测试清空线性表\n");
printf("3:测试求位置的线性表元素值及其前驱后继\n");
printf("4;测试查询某元素的位置\n");
printf("5:测试求线性表的长度\n");
printf("6:结束程序\n");
printf("*****************************************\n");
scanf_s("%d", &opt);
switch (opt)
{
case 1:
printf("线性表长度\n");
scanf_s("%d", &size);
data = (ElemType*)malloc(sizeof(ElemType) * (size+1));
if (data == NULL) break;
printf("线性表元素\n");
for (i = 1; i <=size; i++)
{
scanf_s("%d", &data[i]);
}
s = Test_CreateList(&list, data, size);/*根据读入的数据建立线性表*/
if (s != success) printf("建立线性表失败\n");
free(data);
List_Destory(&list);
break;
case 2:
printf("线性表长度\n");
scanf_s("%d", &size);
data = (ElemType*)malloc(sizeof(ElemType) * (size+1));
if (data == NULL) break;
printf("线性表元素\n");
for (i = 1; i <= size; i++)
{
scanf_s("%d", &data[i]);
}
s = Test_CreateList(&list, data, size);/*根据读入的数据建立线性表*/
if (s == success)
{
if (!List_Empty(&list))
{
List_Clear(&list);
if (List_Empty(&list))
{
printf("已经清空线性表\n");
}
}
}
free(data);
List_Destory(&list);
break;
case 3:
printf("线性表长度\n");
scanf_s("%d", &size);
data = (ElemType*)malloc(sizeof(ElemType) * (size+1));
if (data == NULL) break;
printf("线性表元素\n");
for (i = 1; i <= size; i++)
{
scanf_s("%d", &data[i]);
}
s = Test_CreateList(&list, data, size);/*根据读入的数据建立线性表*/
if (s == success)
{
printf("输入待查找元素的位置\n");
scanf_s("%d", &pos);
Test_Retrivalpriornext(&list, pos);
}
free(data);
List_Destory(&list);
break;
case 4:
printf("线性表长度\n");
scanf_s("%d", &size);
data = (ElemType*)malloc(sizeof(ElemType) * (size+1));
if (data == NULL) break;
printf("线性表元素\n");
for (i = 1; i <= size; i++)
{
scanf_s("%d", &data[i]);
}
s = Test_CreateList(&list, data, size);/*根据读入的数据建立线性表*/
if (s == success)
{
printf("输入待查询的元素值\n");
scanf_s("%d", &e);
Test_Locate(&list, e);
}
free(data);
List_Destory(&list);
break;
case 5:
printf("线性表长度\n");
scanf_s("%d", &size);
data = (ElemType*)malloc(sizeof(ElemType) * (size+1));
if (data == NULL) break;
printf("线性表元素\n");
for (i = 1; i <= size; i++)
{
scanf_s("%d", &data[i]);
}
s = Test_CreateList(&list, data, size);/*根据读入的数据建立线性表*/
if (s == success)
{
Test_Size(&list);
}
free(data);
List_Destory(&list);
break;
default:
break;
}
}
return 0;
}
4.感谢戴波老师,欢迎交流指正!!!