一、三顺序表
head65.3.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAX 7
typedef struct seq_list
{
int date[MAX];
int len;
}seq_list,*seq_p;
seq_p creat_list();
int empty_seq(seq_p S);
int full_seq(seq_p S);
void insert_head(seq_p S,int date);
void insert_tail(seq_p S,int date);
void delete_head(seq_p S);
void clear_seq(seq_p S);
void pos_insert(seq_p S,int pos,int date);
void free_seq_p(seq_p S);
void show(seq_p *S);
void remove_duplicates(seq_p S);
void pos_delete(seq_p S,int pos);
#endif
main65.3.c
#include"head65.3.h"
int main()
{
seq_p S=creat_list();
printf("%p\n",S);
empty_seq(S);
insert_head(S,60);
insert_head(S,60);
insert_head(S,11);
remove_duplicates(S);
pos_insert(S,2,5);
delete_head(S);
insert_tail(S,12);
show(S);
free_seq_p(&S);//二级指针
}
test-65.3.c
#include"head65.3.h"
//创建
seq_p creat_list()
{
seq_p S = (seq_p)malloc(sizeof(seq_list));
if(S==NULL)
{
printf("fail to apply\n");
return NULL;
}
S->len=0;
bzero(S->date,sizeof(S->date));
return S;
}
//判空
int empty_seq(seq_p S)
{
if(S==NULL)
{
printf("intput empty\n");
return -1;
}
return S->len==0?1:0;
}
//判满
int full_seq(seq_p S)
{
if(S==NULL)
{
printf("intput empty\n");
return -1;
}
return S->len==MAX?1:0;
}
//头插
void insert_head(seq_p S,int date)
{
if(S==NULL)
{
printf("input empty\n");
return;
}
if(full_seq(S))
{
printf("intput full,no inserting!\n");
return;
}
for(int i=S->len-1;i>=0;i--)
{
S->date[i+1]=S->date[i];
}
S->date[0]=date;
S->len++;
}//尾插
void insert_tail(seq_p S,int date)
{
if(S==NULL)
{
printf("input empty\n");
return;
}
if(full_seq(S))
{
printf("input full,no inserting!\n");
return;
}
S->date[S->len]=date;
S->len++;
}
//头删
void delete_head(seq_p S)
{
if(S==NULL)
{
printf("input empty\n");
return;
}
if(empty_seq(S))
{
printf("intput empty,don't delete!\n");
return;
}
for(int i=1;i<S->len;i++)
{
S->date[i-1]=S->date[i];
}
S->len--;
}
//清空
void clear_seq(seq_p S)
{
if(S==NULL)
{
printf("input empty,don't clear\n");
return;
}
bzero(S->date,sizeof(S->date));
S->len=0;
}
//按位置插入
void pos_insert(seq_p S,int pos,int date)
{
if(S==NULL)
{
printf("input empty\n");
return;
}
if(full_seq(S))
{
printf("input full,no inserting!\n");
}
for(int i=S->len;i>=pos;i--)
{
S->date[i]=S->date[i-1];
}
S->date[pos-1]=date;
S->len++;
}
//释放
void free_seq_p(seq_p *S)//可以传一级指针,但不能给主函数S置空,原因形参与实参是两个指针,拥有不同的空间
{
if(S==NULL||*S==NULL)//位置不能交换,S为二级指针,要先判断二级指针不为空,再判断其指向不为空
{
printf("input empty\n");
return;
}
free(*S);
*S=NULL;
}
//输出
void show(seq_p S)
{
if(empty_seq(S))
{
printf("input empty,don't input!\n");
return;
}
for(int i=0;i<S->len;i++)
printf("%d\n",S->date[i]);
}
//按位置删除
void pos_delete(seq_p S,int pos)
{
if(S==NULL)
{
printf("input empty\n");
return;
}
if(empty_seq(S))
{
printf("input empty,don't delete!\n");
return;
}
if(pos>S->len||pos<0)
{
printf("enter pos error\n");
return;
}
for(int i=pos;i<S->len;i++)
{
S->date[i-1]=S->date[i];
}
S->len--;
}
//去重
void remove_duplicates(seq_p S)
{
if(S==NULL)
{
printf("input empty\n");
return;
}
if(empty_seq(S))
{
printf("input empty,don't delete!\n");
return;
}
if(S->len==1)
{
printf("only one element,don't delete!");
}
for(int i=0;i<S->len;i++)
{
for(int j=i+1;j<S->len;j++)
{
if(S->date[i]==S->date[j])
{
pos_delete(S,j+1);
j--;//按位置删除后,已判断后,被新的元素覆盖了,需要重新判断
}
}
}
}
二、思维导图