数据结构_基于顺序表的通讯录

顺序表代码

SeqList.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Contact.h"

typedef PF SeqList_Datatype;

typedef struct SeqList
{
SeqList_Datatype* Data;
int size;
int capacity;
}SL;

//顺序表初始化
void SLInit(SL* ps);
//顺序表的销毁
void SLDestroy(SL* ps);
void SLPrint(SL ps);

//头部插入删除 尾部插入删除
void SLPushBack(SL* ps, SeqList_Datatype x);
void SLPushFront(SL* ps, SeqList_Datatype x);
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);

//指定位置之前插入/删除数据
void SLInsert(SL* ps, int pos, SeqList_Datatype x);
void SLErase(SL* ps, int pos);

//查找修改
int SLFind(SL* ps, SeqList_Datatype x);
void SeqListModity(SL* ps, int pos, SeqList_Datatype x);

SeqList.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"

void SLInit(SL* ps)//初始化
{
ps->Data = NULL;
ps->capacity = ps->size = 0;
}

void SLDestroy(SL* ps)//销毁
{
if (ps->Data)
free(ps->Data);
ps->Data = NULL;
ps->size = ps->capacity = 0;
}

void SLPrint(SL ps)//打印
{
for (int i = 0; i < ps.size; i++)
printf("%d ",ps.Data[i]);
printf("\n");
}

void Check_Capacity(SL* ps)//扩容
{
if (ps->capacity == ps->size)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
SeqList_Datatype* tmp = (SeqList_Datatype*)realloc(ps->Data, sizeof(SeqList_Datatype) * newcapacity);
if (tmp == NULL)
{
perror("realloc is fail!");
exit(1);
}
ps->Data = tmp;
ps->capacity = newcapacity;
}
}

void SLPushBack(SL* ps, SeqList_Datatype x)//尾插
{
assert(ps);
Check_Capacity(ps);
ps->Data[ps->size++] = x;
}

void SLPushFront(SL* ps, SeqList_Datatype x)//头插
{
assert(ps);
Check_Capacity(ps);
for (int i = ps->size; i > 0; i--)
{
ps->Data[i] = ps->Data[i - 1];
}
ps->Data[0] = x;
ps->size++;
}

void SLPopBack(SL* ps)//尾删
{
assert(ps);
assert(ps->size);
ps->size--;
}

void SLPopFront(SL* ps)//头删
{
assert(ps);
assert(ps->size);
for (int i = 0; i < ps->size - 1; i++)
{
ps->Data[i] = ps->Data[i + 1];
}
ps->size--;
}

void SLInsert(SL* ps, int pos, SeqList_Datatype x)//指定插入 pos是下标,不是第几个!
{
assert(ps);
Check_Capacity(ps);
for (int i = ps->size; i > pos + 1; i--)
{
ps->Data[i] = ps->Data[i - 1];
}
ps->Data[pos] = x;
ps->size++;
}

void SLErase(SL* ps, int pos)//指定删除
{
assert(ps);
for (int i = pos; i < ps->size; i++)
{
ps->Data[i] = ps->Data[i + 1];
}
ps->size--;
}

//int SLFind(SL* ps, SeqList_Datatype x)//查找
//{
// assert(ps);
// for (int i = 0; i < ps->size; i++)
// {
// if (x == ps->Data[i])
// return i;
// }
// return -1;
//}

void SeqListModity(SL* ps, int pos, SeqList_Datatype x)//修改
{
assert(ps);
assert(pos < ps->size);
ps->Data[pos] = x;
}

通讯录代码(以顺序表为底层逻辑)

在顺序表的基础上,新定义一个(personinfo)结构体,将这个结构体作为顺序表的数据类型,存储在顺序表中。通过顺序表的基本接口实现personinfo的增删查改。

顺序表部分让我觉得很痛苦的是,在对尾部进行操作的时候需要用while进行找尾,这里我经常搞错循环进行的结束条件。需要注意。

Contact.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

#define NAME_MAX 20
#define TEL_MAX 11

typedef struct personinfo
{
char name[NAME_MAX];
char tel[TEL_MAX];
}PF;

typedef struct SeqList Contact;


//通讯录的初始化
void ContactInit(Contact* con);
//通讯录的销毁
void ContactDesTroy(Contact* con);
//通讯录添加数据
void ContactAdd(Contact* con);
//通讯录删除数据
void ContactDel(Contact* con);
//通讯录的修改
void ContactModify(Contact* con);
//通讯录查找
void ContactFind(Contact* con);
//展示通讯录数据
void ContactShow(Contact* con);

Conatct.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"
#include"SeqList.h"
#include<string.h>

void ContactInit(Contact* con)
{
SLInit(con);
}

void ContactDesTroy(Contact* con)
{
void SLDestroy(con);
}

void ContactAdd(Contact* con)
{
PF info;
printf("请输入姓名:");
scanf("%s", info.name);
printf("请输入电话号码:");
scanf("%s", info.tel);
SLPushBack(con, info);
}

int FindbyName(Contact* con, char* name)
{
for (int i = 0; i < con->size; i++)
if (0 == strcmp(con->Data[i].name, name))
{
return i;
}
return -1;
}

void ContactDel(Contact* con)
{
char name[NAME_MAX];
printf("请输入要删除的人的名字:");
scanf("%s",name);
int find = FindbyName(con, name);
if (find < 0)
{
printf("查无此人");
return;
}
void SLErase(con, find);
printf("删除成功!\n");
}

void ContactShow(Contact* con)
{
int i = 0;
for (i = 0; i < con->size; i++)
{
printf("\n第%d位:", i);
printf("姓名:%s ", con->Data[i].name);
printf("电话:%s\n", con->Data[i].tel);
}
}

void ContactModify(Contact* con)
{
char name[NAME_MAX];
printf("请输入要修改的人的名字:");
scanf("%s",name);
int find = FindbyName(con, name);
if (find < 0)
{
printf("您输入的人不存在!");
return;
}
printf("请重新输入名字:");
scanf("%s",con->Data[find].name);
printf("请重新输入电话:");
scanf("%s", con->Data[find].tel);
printf("信息修改成功!\n");
}

void ContactFind(Contact* con)
{
char name[NAME_MAX];
printf("请输入要查找的人的名字:");
scanf("%s", name);
int find = FindbyName(con, name);
if (find < 0)
{
printf("您要查找的人不存在!");
return;
}
printf("姓名:%s\n",con->Data[find].name);
printf("电话:%s\n", con->Data[find].tel);

}

本博客旨在记录学习过程,以后忘了随时来看。