LinuxC言語アドレス帳

アドレス帳は、多くの携帯電話やその他の電子製品に不可欠な機能の1つであり、データ構造のリンクリストに関する関連知識を身に付ければ、簡単なアドレス帳を自分で作成できます。

アドレス帳作成の基礎知識

  1. 構造
  • 構造は何ですか?端的に言えば、構造はタイプであり、他のタイプの集約でもかまいません。たとえば、配列はその要素タイプのコレクション、int a [10]はintタイプのコレクションです。同様に、構造は独自のいくつかの要素タイプのコレクションですが、なぜいくつかあるのですか?これには、配列と構造の違いが含まれます。配列内の要素のタイプは決定され、一貫していますが、構造内では、要素は異なるタイプにすることができます。
  • この記事で使用されている構造
//个人信息
struct people
{
    
    
	char name[20];
	int number;
};
  1. リンクされたリスト
  • リンクリストは、ポインターで接続されたデータ要素を格納する一連のユニットであるため、各ユニットには少なくとも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");は表示される色を変更するためのものであり、不要な場合は削除できます。

実行結果

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_46026429/article/details/108484048