LinuxC言語アドレス帳
アドレス帳は、多くの携帯電話やその他の電子製品に不可欠な機能の1つであり、データ構造のリンクリストに関する関連知識を身に付ければ、簡単なアドレス帳を自分で作成できます。
アドレス帳作成の基礎知識
- 構造
- 構造は何ですか?端的に言えば、構造はタイプであり、他のタイプの集約でもかまいません。たとえば、配列はその要素タイプのコレクション、int a [10]はintタイプのコレクションです。同様に、構造は独自のいくつかの要素タイプのコレクションですが、なぜいくつかあるのですか?これには、配列と構造の違いが含まれます。配列内の要素のタイプは決定され、一貫していますが、構造内では、要素は異なるタイプにすることができます。
- この記事で使用されている構造
//个人信息
struct people
{
char name[20];
int number;
};
- リンクされたリスト
-
リンクリストは、ポインターで接続されたデータ要素を格納する一連のユニットであるため、各ユニットには少なくとも2つのフィールドがあり、1つのフィールドはデータ要素の格納に使用され、もう1つまたは2つのフィールドは他のユニットへのポインターです。1つのデータフィールドと複数のポインターフィールドを持つストレージユニットは、通常ノードと呼ばれます。
-
リンクリストの最初のノードと最後のノードは、それぞれリンクリストの先頭ノードと終了ノードと呼ばれます。末尾ノードの特徴は、次の参照がnullであることです。リンクリスト内の各ノードの次の参照は、別のノードへのポインタに相当します。これらの次の参照により、リンクリストの先頭ノードから終了ノードに移動できます
-
この記事で使用されているリンクリストノード
//双向链表节点设计
struct double_list
{
struct double_list *prev; //用于存放上一个(前缀)节点地址指针变量
struct people data; //数据 数据域
struct double_list *next; //用于存放下一个(后缀)节点地址指针变量
};
特徴
- リンクされたリストを使用して、追加(人員の追加の過程で、名前によるソートなどの自動ソート機能があります)、削除、変更、および検索(ジョブ番号検索、電話検索など)の機能を実現します。
- ユーザー情報を追加する
- 友達情報を一覧表示する
- 友達の情報を見つける(名前、番号で検索)
- 友達を削除
- 数を変える
- 脱落
コード
リンクリストノードの作成
//(2)节点初始化(在堆空间生成节点)
struct double_list *new_node(void)
{
struct double_list *p = NULL; //指针变量p
//在堆空间开辟内存,大小为:sizeof(struct double_list)
p = (struct double_list *)malloc(sizeof(struct double_list));
if(p == NULL)
{
printf("开辟空间失败!\n");
return 0;
}
p->data.number=0;//结构体成员初始化
//两个指针成员存放自己的地址,即单个节点也是循环链表
p->next = p;
p->prev = p;
return p;
}
ノードの挿入により、リンクリストの先頭にノードが追加されます
void insert_node(struct double_list *p, struct double_list *new)
{
if(p == NULL || new == NULL)
{
return;
}
new->next = p->next;
p->next->prev = new;
new->prev = p;
p->next = new;
}
ノードの挿入により、リンクリストの末尾にノードが追加されます
void insert_node_tail(struct double_list *p, struct double_list *new)
{
if(p == NULL || new == NULL)
{
return;
}
p->prev->next = new;
new->prev = p->prev;
p->prev = new;
new->next = p;
}
ノード検索(名前、番号)
struct double_list *find_node(struct double_list *head, struct people s)
{
struct double_list *p;
int ret;
p = head->next; //指针第一个数据节点
while(p != head) //有数据节点
{
ret = strcmp(p->data.name,s.name);
if(ret == 0)
{
return p; //返回节点地址 结束循环
}
p = p->next; //移动到下一个节点
}
//遍历完成整个链表,无法查找与数据相等的节点,返回NULL
return NULL;
}
struct double_list *find_node1(struct double_list *head, struct people s)
{
struct double_list *p;
int ret;
p = head->next; //指针第一个数据节点
while(p != head) //有数据节点
{
if(p->data.number == s.number);
if(ret == 0)
{
return p; //返回节点地址 结束循环
}
p = p->next; //移动到下一个节点
}
//遍历完成整个链表,无法查找与数据相等的节点,返回NULL
return NULL;
}
ノードの削除
void del_node(struct double_list *del)
{
del->prev->next = del->next;
del->next->prev = del->prev;
del->prev = del;
del->next = del;
}
削除する前に検索操作を実行したため、ここのコード操作でデータノードが解決されるので、main関数でノードを解放します。
ノードを表示
//节点显示
void display_node(struct double_list *head)
{
struct double_list *p;
p = head->next; //指针第一个数据节点
while(p != head) //有数据节点
{
printf("名字:%s\t", p->data.name);
printf("电话号码:%d", p->data.number);
printf("\n");
p = p->next;
}
printf("\n");
}
主な機能ロジック
printf("\033[1;31;46m=========================通讯录============================ \033[0m\n");
printf("******************* 添加联系人 :1******************\n");
printf("******************* 查看所有 :2******************\n");
printf("******************* 查找联系人(名) :3******************\n");
printf("******************* 查找联系人(号) :4******************\n");
printf("******************* 删除联系人 :5******************\n");
printf("******************* 修改联系方式 :6******************\n");
printf("******************* 退出通讯录 :q******************\n");
printf("\033[1;31;46m=========================================================== \033[0m\n");
ここでprintf( "\ 033");は表示される色を変更するためのものであり、不要な場合は削除できます。