1.顺序表
#include <stdio.h>
#include <stdlib.h>
#define N 10
typedef struct
{
int data[N];
int last;//last代表的是数组中最后一个有效元素的下标
}seqlist_t;
//1.创建一个空的顺序表
seqlist_t* CreateEpSeqlist();//返回的是申请空间的首地址
//2.向顺序表的指定位置插入数据
int InsertIntoSeqlist(seqlist_t* p, int post, int data);//post第几个位置,data插入的数据
//3.遍历顺序表sequence 顺序 list 表
void ShowSeqlist(seqlist_t* p);
//4.判断顺序表是否为满,满返回1 未满返回0
int IsFullSeqlist(seqlist_t* p);
//5.判断顺序表是否为空
int IsEpSeqlist(seqlist_t* p);
//6.删除顺序表中指定位置的数据post删除位置
int DeletePostSeqlist(seqlist_t* p, int post);
//7.清空顺序表
void ClearSeqList(seqlist_t* p);
//8.修改指定位置的数据
void ChangePostSeqList(seqlist_t* p, int post, int data);//post被修改的位置,data修改成的数据
//9.查找指定数据出现的位置
int SearchDataSeqList(seqlist_t* p, int data);//data代表被查找的数据
//10.合并表
void CombineAB(seqlist_t *p,seqlist_t *pb);
int main()
{
seqlist_t* p = CreateEpSeqlist();//创建一个空的顺序表
InsertIntoSeqlist(p, 0, 1);
InsertIntoSeqlist(p, 1, 2);
InsertIntoSeqlist(p, 2, 3);
InsertIntoSeqlist(p, 3, 4);
ShowSeqlist(p);//1 2 3 4
DeletePostSeqlist(p, 1);
ShowSeqlist(p);//1 3 4
ChangePostSeqList(p, 1, 100);
ShowSeqlist(p);//1 100 4
int t;//承接查找数据的下标
t=SearchDataSeqList(p, 4);
printf("4 post is %d\n", t);//1
// ShowSeqlist(p);
// ClearSeqList(p);
// ShowSeqlist(p);
seqlist_t* pb = CreateEpSeqlist();
InsertIntoSeqlist(pb, 0, 1);
InsertIntoSeqlist(pb, 1, 100);
InsertIntoSeqlist(pb, 2, 200);
InsertIntoSeqlist(pb, 3, 300);
InsertIntoSeqlist(pb, 4, 400);
InsertIntoSeqlist(pb, 5, 500);
InsertIntoSeqlist(pb, 6, 600);
// InsertIntoSeqlist(pb, 7, 700);
// InsertIntoSeqlist(pb, 8, 800);
// InsertIntoSeqlist(pb, 9, 900);
ShowSeqlist(pb);
CombineAB(p,pb);
ShowSeqlist(p);
return 0;
}
//1.创建一个空的顺序表
seqlist_t* CreateEpSeqlist()//返回的是申请空间的首地址
{
//动态申请一块空间
seqlist_t* p = (seqlist_t*)malloc(sizeof(seqlist_t));
//sizeof(seqlist_t)计算结构体的大小
if (p == NULL) {
printf("申请空顺序表错误\n");
return NULL;
}
//last是最后一个有效元素的下标
p->last = -1;//空
return p;
}
//4.判断顺序表是否为满,满返回1 未满返回0
int IsFullSeqlist(seqlist_t* p)
{
return p->last+1== N;//成立返回1(满),不成立返回0
}
//2.向顺序表的指定位置插入数据
int InsertIntoSeqlist(seqlist_t* p, int post, int data)//post第几个位置,data插入的数据
{
//1、容错判断
//小于最小,大于最大;顺序表满了帮你插入
if (post<0 || post>p->last+1|| IsFullSeqlist(p)) {
printf("插入失败\n");
return -1;//错误返回
}
//2、last-post往后移动一个位置
int i;
for (i = p->last;i>=post; i--) {
p->data[i+1] = p->data[i];
}
//3、插入数据
p->data[post] = data;
//4、p->last+1
p->last++;
return 0;
}
//3.遍历顺序表sequence 顺序 list 表
void ShowSeqlist(seqlist_t* p)
{
int i;
for (i = 0; i <= p->last; i++) {
printf("%d ", p->data[i]);
}
printf("\n");
}
//5.判断顺序表是否为空
int IsEpSeqlist(seqlist_t* p)
{
return p->last == -1;
}
//6.删除顺序表中指定位置的数据post删除位置
int DeletePostSeqlist(seqlist_t* p, int post)
{
//1、容错判断
if (post > p->last || post < 0 || IsEpSeqlist(p)) {
printf("删除失败\n");
return -1;
}
//2、post+1-last向前移动一个位置
int i;
for (i = post + 1; i <= p->last; i++) {
p->data[i - 1] = p->data[i];
}
//3、有效元素-1
p->last--;
return 0;
}
//7.清空顺序表(清空:访问不到,但内存当中还有;销毁:内存清空)
void ClearSeqList(seqlist_t* p)
{
p->last = -1;
}
//8.修改指定位置的数据
void ChangePostSeqList(seqlist_t* p, int post, int data)//post被修改的位置,data修改成的数据
{
//1、容错判断
if (post<0 || post>p->last) {
printf("修改失败\n");
}
//2、修改指定位置数据
p->data[post] = data;
}
//9.查找指定数据出现的位置
int SearchDataSeqList(seqlist_t* p, int data)//data代表被查找的数据
{
int i;
for (i = 0; i <= p->last; i++) {
if (p->data[i] == data) {
return i;
}
}
return -1;
}
//10.合并表
void CombineAB(seqlist_t *p,seqlist_t *pb)
{
int i;
for(i=0;i<=pb->last;i++){
if(SearchDataSeqList(p,pb->data[i])==-1){//没有找到
InsertIntoSeqlist(p,p->last+1,pb->data[i]);
}
}
}
链表
#include <stdio.h>
#include <stdlib.h>
typedef int datatype; //datatype是数据的类型,这里写的int那就是int类型,
//后面如果想传参都用datatype,如果想用char就把int换成char,接下来只用改输入输出的格式,其他的都不用改
typedef struct node_t
{
datatype data;//数据域
struct node_t* next;//指针域,指向自身结构体的指针
}link_node_t, * link_list_t;
//1.创建一个空的单向链表(有头单向链表)
link_node_t* CreateEpLinkList();
//2.向单向链表的指定位置插入数据
//p保存链表的头指针 post 插入的位置 data插入的数据
int InsertIntoPostLinkList(link_node_t* p, int post, datatype data);
//3.遍历单向链表
void ShowLinkList(link_node_t* p);
//4.求单向链表长度的函数
int LengthLinkList(link_node_t* p);
//5.删除单向链表中指定位置的数据 post 代表的是删除的位置
int DeletePostLinkList(link_node_t* p, int post);
//6.判断单向链表是否为空 1代表空 0代表非空
int IsEpLinkList(link_node_t* p);
//7.修改指定位置的数据 post 被修改的位置 data修改成的数据
int ChangePostLinkList(link_node_t* p, int post, datatype data);
//8.查找指定数据出现的位置 data被查找的数据 //search 查找
int SearchDataLinkList(link_node_t* p, datatype data);
//9.删除单向链表中出现的指定数据,data代表将单向链表中出现的所有data数据删除
int DeleteDataLinkList(link_node_t* p, datatype data);
//10.转置链表
void ReverseLinkList(link_node_t* p);
//11.清空单向链表
void ClearLinkList(link_node_t* p);
int main()
{
link_list_t p = CreateEpLinkList();
InsertIntoPostLinkList(p, 0, 1);
InsertIntoPostLinkList(p, 1, 2);
InsertIntoPostLinkList(p, 2, 3);
InsertIntoPostLinkList(p, 3, 4);
InsertIntoPostLinkList(p, 4, 5);
InsertIntoPostLinkList(p, 5, 6);
InsertIntoPostLinkList(p, 6, 7);
ShowLinkList(p);//1 2 3 4 5
DeletePostLinkList(p, 1);
ShowLinkList(p);//1 3 4 5
ChangePostLinkList(p, 1, 100);
ShowLinkList(p);
int post;
post=SearchDataLinkList(p, 4);
printf("4 post is %d\n",post);
DeleteDataLinkList(p, 4);
ShowLinkList(p);
ReverseLinkList(p);
ShowLinkList(p);
return 0;
}
//1.创建一个空的单向链表(有头单向链表)
link_node_t* CreateEpLinkList()
{
//创建节点
link_list_t p = (link_list_t)malloc(sizeof(link_node_t));
if (p == NULL)
{
printf("error\n");
return NULL;
}
//头节点初始化
p->next = NULL;
return p;
}
//4.求单向链表长度的函数(不包含头节点,是实际数据长度)
int LengthLinkList(link_node_t* p)
{
int len = 0;
while (p->next != NULL) {
p = p->next;
len++;
}
return len;
}
//2.向单向链表的指定位置插入数据
//p保存链表的头指针 post 插入的位置 data插入的数据
int InsertIntoPostLinkList(link_node_t* p, int post, datatype data)
{
//1.容错判断
if (post<0 || post>LengthLinkList(p)) {
printf("error\n");
return -1;
}
//2.头指针往后移动,指向插入位置前一个节点
int i;
for (i = 0; i < post; i++) {
p = p->next;
}
//3.创建新节点,保存插入数据
link_list_t pnew = (link_list_t)malloc(sizeof(link_node_t));
if (pnew == NULL)
{
printf("error\n");
return -1;
}
pnew->data = data;
pnew->next = NULL;
//4.新节点插入链表,先连后面,再连前面
pnew->next = p->next;
p->next=pnew;
return 0;
}
//3.遍历单向链表
void ShowLinkList(link_node_t* p)
{
while (p->next != NULL) {
p = p->next;
printf("%d ", p->data);
}
printf("\n");
}
//6.判断单向链表是否为空 1代表空 0代表非空
int IsEpLinkList(link_node_t* p)
{
return p->next == NULL;
}
//5.删除单向链表中指定位置的数据 post 代表的是删除的位置
int DeletePostLinkList(link_node_t* p, int post)
{
//1.容错判断
if (post < 0 || post >= LengthLinkList(p) || IsEpLinkList(p)) {
printf("error\n");
return -1;
}
//2.头节点指向被删除节点的前一个位置
int i;
for (i = 0; i < post; i++) {
p = p->next;
}
//3.删除
link_list_t pdel = NULL;
//(1)定义一个pedl指针指向被删除位置
pdel = p->next;
//(2)跨过被删除节点
p->next = pdel->next;
//(3)释放被删除节点
free(pdel);
pdel = NULL;
return 0;
}
//11.清空单向链表
void ClearLinkList(link_node_t* p)
{
link_list_t pdel = NULL;
//有头的遍历单向链表
while (p->next != NULL) {
//(1)pdel指向被删除节点
pdel = p->next;//每次删除头节点的下一个
//(2)跨过删除
p->next = pdel->next;
//(3)释放
free(pdel);
pdel = NULL;
}
}
//7.修改指定位置的数据 post 被修改的位置 data修改成的数据
int ChangePostLinkList(link_node_t* p, int post, datatype data)
{
//1.容错判断
if (post < 0 || post >= LengthLinkList(p)) {
printf("error\n");
return -1;
}
//2.头指针移动到被修改节点
int i;
for (i = 0; i < post + 1; i++) {
p = p->next;
}
//3.修改数据
p->data = data;
return 0;
}
//8.查找指定数据出现的位置 data被查找的数据 /arch 查找
int SearchDataLinkList(link_node_t* p, datatype data)
{
int post = 0;//记录查找位置
//遍历链表
while (p->next != NULL)
{
//先往前走一个,因为头节点没有数据
p = p->next;
if (p->data == data) {
return post;
}
post++;
}
//如果遍历玩还没有找到
return -1;//说明数据不存在
}
//9.删除单向链表中出现的指定数据,data代表将单向链表中出现的所有data数据删除
int DeleteDataLinkList(link_node_t* p, datatype data)
{
/*
if (相等) {//删
pdel = q;
p->next = pdel->next;
free(pdel);
pedl = NULL;
q = p->next;
}
else
{
p = p->next;
q = q->next;
}
*/
link_list_t pdel = NULL;//指向被删除节点
//1.定义q
link_list_t q = p->next;
//q来遍历单向无头链表,每个节点data比较
while (q != NULL) {
if (q->data == data) {
pdel = q;
p->next = pdel->next;
free(pdel);
pdel = NULL;
q = p->next;
}
else {
p = p->next;
q = q->next;
}
}
return 0;
}
//10.转置链表
//(1) 将头节点与当前链表断开,断开前保存头节点的下一个节点,保证后面链表能找得到,定义一个q保存头节点的下一个节点,断开后前面相当于一个空的链表,后面是一个无头的单向链表
//(2) 遍历无头链表的所有节点,将每一个节点当做新节点插入空链表头节点的下一个节点(每次插入的头节点的下一个节点位置--头插法)
void ReverseLinkList(link_node_t* p)
{
//定义temp暂时保存后面节点
link_list_t temp = NULL;
//1.断开之前保存头节点下一个节点
link_list_t q = p->next;
//2.断开链表
p->next = NULL;
//3.遍历无头链表
while (q != NULL) {
//提前把q下一个节点保存一下
temp = q->next;
//先连后面,再连前面
q->next = p->next;
p->next = q;
//q移动,移动到无头链表下一个节点
q = temp;
}
}