作业
题目
-
顺序表按元素删除
- 思路:
- 参数【顺序表 删除的值
key
】 - 根据删除的元素得到下标
- 根据下标实现【按下标删除】
- 参数【顺序表 删除的值
- 思路:
-
顺序表排序【类似数组排序】
比较:if( list->data[j] > list->data[j+1])
-
复习今天的学习内容
结果
代码
main.c
#include "func.h"
int main(int argc, char const *argv[])
{
// 创建空表
SeqList *list = list_create();
// 表尾插入
for (int i = 0; i < MAXSIZE; i++){
list_rear_insert(list,(DataType)(i * 7));
}
// 遍历
list_traverse(list);
/********************************
* 作业1:按元素删除
********************************/
// 按元素删除
printf("顺序表按元素56删除后\n");
list_elem_delete(list,56);
// 遍历
list_traverse(list);
/********************************
* 作业2:顺序表排序
********************************/
// 排序
list_sort(list);
// 遍历
printf("顺序表排序后\n");
list_traverse(list);
return 0;
}
func.h
#include "func.h"
/*
* 创建顺序表
* @return 成功 顺序表指针 失败NULL
*/
SeqList *list_create(){
SeqList *l = (SeqList *)malloc(sizeof(SeqList));
if(l == NULL){
return NULL;
}
l->len = 0;
return l;
}
/*
* 尾部插入
* @param l 顺序表
* @param e 要插入的元素
* @return 成功0 失败-1
*/
int list_rear_insert(SeqList *l,DataType e){
if(list_is_full(l)){
printf("顺序表满\n");
return -1;
}
l->data[l->len] = e;
l->len++;
return 0;
}
/*
* 判断表是否满
* @param l 顺序表
* @return 满-1 未满0
*/
int list_is_full(SeqList *l){
return l->len == MAXSIZE ? -1 : 0;
}
/*
* 遍历输出
* @param l 顺序表
* @param e 要插入的元素
* @return 成功0 失败-1
*/
int list_traverse(SeqList *l){
for (int i = 0; i < l->len; i++){
printf("list[%d]=%d\t",i,l->data[i]);
// printf("(%d, %d)\t",i,l->data[i]);
}
putchar('\n');
}
/*
* 按元素删除
* @param l 顺序表
* @param e 要删除的元素
* @return 成功0 失败-1
*/
int list_elem_delete(SeqList *l,DataType e){
//找到下标
int index = list_elem_indexof(l,e);
//按下标删除
list_delete(l,index);
return 0;
}
/*
* 按元素查找
* @param l 顺序表
* @param e 要查找的元素
* @return 成功 元素下标 失败 -1
*/
int list_elem_indexof(SeqList *l,DataType e){
for (int i = 0; i < l->len; i++){
if(l->data[i] == e){
return i;
}
}
return -1;
}
/*
* 按下标删除元素
* @param l 顺序表
* @param index 要删除元素的下标
* @return 成功0 失败-1
*/
int list_delete(SeqList *l,int index){
// 判空
if(list_is_empty(l)){
printf("顺序表空\n");
return -1;
}
// 判断下标
if(index < 0 || index >= l->len){
printf("非法下标\n");
return -1;
}
// 循环前移
for (int i = index + 1; i < l->len; i++){
l->data[i - 1] = l->data[i];
}
// 表长-1
l->len--;
return 0;
}
/*
* 判断表是否空
* @param l 顺序表
* @return 空-1 未空0
*/
int list_is_empty(SeqList *l){
return l->len == 0 ? -1 : 0;
}
/*
* 顺序表排序
* @param l 顺序表
* @return 无返回值
*/
void list_sort(SeqList *l){
// 冒泡排序
for (int i = 0; i < l->len - 1; i++){
for (int j = 0; j < l->len - 1 - i; j++){
DataType t = l->data[j];
l->data[j] = l->data[j+1];
l->data[j+1] = t;
}
}
}
func.c
#if !defined(_FUNC_H_)
#define _FUNC_H_
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
// 定义顺序表
typedef int DataType;
typedef struct{
DataType data[MAXSIZE];
int len;
}SeqList;
SeqList *list_create();
int list_is_full(SeqList *l);
int list_rear_insert(SeqList* l,DataType e);
int list_traverse(SeqList* l);
int list_elem_delete(SeqList *l,DataType e);
int list_elem_indexof(SeqList* l,DataType e);
int list_delete(SeqList *l,int index);
int list_is_empty(SeqList *l);
void list_sort(SeqList *l);
#endif // _FUNC_H_