作业:
1> 顺序表按元素删除
思路:参数【顺序表 删除的值key】
1.根据删除的元素得到下标
2.根据下标实现【按下标删除】
2>顺序表排序【类似数组排序】
比较:if( list->data[j] > list->data[j+1])
3> 复习今天的学习内容
#ifndef __HEAD__
#define __HEAD__
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 7
typedef int datatype;
typedef struct
{
datatype data[MAXSIZE];
int len;
}seqlist;
seqlist *create();
int full_len(seqlist *list);
int input(seqlist *list, datatype val);
void output(seqlist *list);
int search_sub(seqlist *list, datatype val);
int delete_sub(seqlist *list, int sub);
int delete_val(seqlist *list, datatype val);
void sort(seqlist *list);
#endif
#include "head.h"
int main(int argc, const char *argv[])
{
int n;
printf("请输入元素个数:");
scanf("%d", &n);
seqlist *list = create();
printf("%p\n", list);
datatype val;
//输入元素
for(int i=0; i<n; i++)
{
printf("请输入元素:");
scanf("%d", &val);
input(list, val);
}
output(list);
//删除元素
printf("请输入要删除的元素:");
scanf("%d", &val);
delete_val(list, val);
output(list);
//根据下标删除
int sub;
printf("请输入要删除的下标:");
scanf("%d", &sub);
delete_sub(list, sub);
output(list);
//顺序表排序
sort(list);
return 0;
}
//函数文件
#include "head.h"
/*
* function: 申请线性表结构内存
* @param [ in]
* @param [out]
* @return 线性表地址
*/
seqlist *create()
{
seqlist *list=(seqlist *)malloc(sizeof(seqlist));
if(list == NULL)
{
return NULL;
}
list->len=0;
return list;
}
/*
* function: 判断线性表元素是否已满
* @param [ in]
* @param [out]
* @return 是-1 否0
*/
int full_len(seqlist *list)
{
return list->len==MAXSIZE?-1:0;
}
/*
* function: 输入元素
* @param [ in] 线性表 元素
* @param [out]
* @return
*/
int input(seqlist *list, datatype val)
{
if(full_len(list))
{
printf("元素已满,无法添加\n");
return -1;
}
list->data[list->len] = val;
list->len++;
return 0;
}
/*
* function: 输出元素
* @param [ in] 线性表
* @param [out]
* @return
*/
void output(seqlist *list)
{
printf("输出元素:");
for(int i=0; i<list->len; i++)
{
printf("%d\t", list->data[i]);
}
printf("\n");
}
/*
* function: 根据元素查找对应下标
* @param [ in] 线性表
* @param [out]
* @return 返回下标
*/
int search_sub(seqlist *list, datatype val)
{
for(int i=0; i<list->len; i++)
{
if(list->data[i] == val)
{
return i;
}
}
return -1;
}
/*
* function: 根据下标删除
* @param [ in] 线性表 下标
* @param [out]
* @return 成功0失败-1
*/
int delete_sub(seqlist *list, int sub)
{
if(full_len(list) || sub<0 || sub>=list->len)
{
printf("删除失败\n");
return -1;
}
for(int i=sub+1; i<list->len; i++)
{
list->data[i-1] = list->data[i];
}
list->len--;
return 0;
}
/*
* function: 根据原素删除
* @param [ in] 线性表 元素
* @param [out]
* @return 返回删除的元素下标
*/
int delete_val(seqlist *list, datatype val)
{
int sub = search_sub(list, val);
if(sub==-1)
{
printf("没有此元素:%d\n", val);
return -1;
}
delete_sub(list, sub);
printf("%d\n", sub);
return 0;
}
/*
* function: 排序
* @param [ in] 线性表
* @param [out]
* @return
*/
void sort(seqlist *list)
{
datatype t;
for(int i=1; i<list->len; i++)
{
int count=0;
for(int j=0; j<list->len-i; j++)
{
if(list->data[j] > list->data[j+1])
{
t = list->data[j];
list->data[j] = list->data[j+1];
list->data[j+1] = t;
count++;
}
}
if(count == 0)
{
break;
}
}
for(int i=0; i<list->len; i++)
{
printf("%d\t", list->data[i]);
}
printf("\n");
}