#include <stdio.h> /* Autorise l'utilisation de printf
et de scanf. */
#include <stdlib.h> /* Autorise l'utilisation de malloc
et de free. */
#include <string.h> /* Autorise l'utilisation de strcpy,
strlen et de strcmp. */
/* Type de base d'un élément de liste de personne. */
typedef struct person
{
char *name; /* Nom de la personne. */
char *address; /* Adresse de la personne. */
struct person *next; /* Pointeur sur l'élément suivant. */
} Person;
typedef Person *People; /* Type de liste de personnes. */
/* Fonctions de gestion des listes de personnes : */
/* Fonction d'initialisation d'une liste de personne.
La liste est passée par variable pour permettre son initialisation. */
void init_list(People *lst)
{
*lst = NULL;
}
/* Fonction d'ajout d'une personne. Les paramètres de la personne
sont passés par variables, mais ne peuvent être modifiés car
ils sont constants. Ce sont des chaînes de caractères C, qui
sont donc assimilées à des pointeurs de caractères constants. */
int add_person(People *lst, const char *name, const char *address)
{
/* Crée un nouvel élément : */
Person *p = (Person *) malloc(sizeof(Person));
if (p != NULL)
{
/* Alloue la mémoire pour le nom et l'adresse. Attention,
il faut compter le caractère nul terminal des chaînes : */
p->name = (char *) malloc((strlen(name) + 1) * sizeof(char));
p->address = (char *) malloc((strlen(address) + 1) * sizeof(char));
if (p->name != NULL && p->address != NULL)
{
/* Copie le nom et l'adresse : */
strcpy(p->name, name);
strcpy(p->address, address);
p->next = *lst;
*lst = p;
}
else
{
free(p);
p = NULL;
}
}
return (p != NULL);
}
/* Fonction de suppression d'une personne.
La structure de la liste est modifiée par la suppression
de l'élément de cette personne. Cela peut impliquer la modification
du chaînage de l'élément précédent, ou la modification de la tête
de liste elle-même. */
int remove_person(People *lst, const char *name)
{
/* Recherche la personne et son antécédant : */
Person *prev = NULL;
Person *p = *lst;
while (p != NULL)
{
/* On sort si l'élément courant est la personne recherchée : */
if (strcmp(p->name, name) == 0)
break;
/* On passe à l'élément suivant sinon : */
prev = p;
p = p->next;
}
if (p != NULL)
{
/* La personne a été trouvée, on la supprime de la liste : */
if (prev == NULL)
{
/* La personne est en tête de liste, on met à jour
le pointeur de tête de liste : */
*lst = p->next;
}
else
{
/* On met à jour le lien de l'élément précédent : */
prev->next = p->next;
}
/* et on la détruit : */
free(p->name);
free(p->address);
free(p);
}
return (p != NULL);
}
/* Simple fonction d'affichage. */
void print_list(People const *lst)
{
Person const *p = *lst;
int i = 1;
while (p != NULL)
{
printf("Personne %d : %s (%s)\n", i, p->name, p->address);
p = p->next;
++i;
}
}
/* Fonction de destruction et de libération de la mémoire. */
void destroy_list(People *lst)
{
while (*lst != NULL)
{
Person *p = *lst;
*lst = p->next;
free(p->name);
free(p->address);
free(p);
}
return ;
}
int main(void)
{
int op = 0;
size_t s;
char buffer[16];
char name[256];
char address[256];
/* Crée une liste de personne : */
People p;
init_list(&p);
/* Utilise la liste : */
do
{
printf("Opération (0 = quitter, 1 = ajouter, 2 = supprimer) ?");
fgets(buffer, 16, stdin);
buffer[15] = 0;
op = 3;
sscanf(buffer, "%d", &op);
switch (op)
{
case 0:
break;
case 1:
printf("Nom : ");
fgets(name, 256, stdin); /* Lit le nom. */
name[255] = 0; /* Assure que le caractère nul
terminal est écrit. */
s = strlen(name); /* Supprime l'éventuel saut de ligne. */
if (name[s - 1] == '\n') name[s - 1] = 0;
/* Même opération pour l'adresse : */
printf("Adresse : ");
fgets(address, 256, stdin);
name[255] = 0;
s = strlen(address);
if (address[s - 1] == '\n') address[s - 1] = 0;
add_person(&p, name, address);
break;
case 2:
printf("Nom : ");
fgets(name, 256, stdin);
name[255] = 0;
s = strlen(name);
if (name[s - 1] == '\n') name[s - 1] = 0;
if (remove_person(&p, name) == 0)
{
printf("Personne inconnue.\n");
}
break;
default:
printf("Opération invalide\n");
break;
}
if (op != 0) print_list(&p);
} while (op != 0);
/* Détruit la liste : */
destroy_list(&p);
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
exemples.zip_LOT
共146个文件
cpp:139个
c:7个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 110 浏览量
2022-09-20
22:28:53
上传
评论
收藏 75KB ZIP 举报
温馨提示
a lot of c++ exemples for starting develloping in c++
资源推荐
资源详情
资源评论
收起资源包目录
exemples.zip_LOT (146个子文件)
dynalloc.c 5KB
ptrfonction2.c 998B
ptrfonction1.c 668B
args.c 467B
printf.c 384B
d閏laration.c 375B
variable.c 271B
new_facet.cpp 4KB
bag.cpp 4KB
stack.cpp 3KB
complexe.cpp 3KB
utilisation.cpp 2KB
placement2.cpp 2KB
listop.cpp 2KB
replace.cpp 2KB
codecvt.cpp 2KB
hierarchie.cpp 1KB
overload_istream.cpp 1KB
binary_search.cpp 1KB
search.cpp 1KB
overload_ostream.cpp 1KB
format.cpp 1KB
foncteur2.cpp 1KB
dynamic_cast.cpp 1KB
foncteur1.cpp 1KB
placement1.cpp 1KB
filebuf.cpp 1019B
collate.cpp 1010B
allocateur.cpp 1010B
pqueue.cpp 979B
constructeur.cpp 967B
insertmap.cpp 915B
heap.cpp 895B
itinsrt.cpp 876B
recherche.cpp 818B
strbuf.cpp 785B
fonctred.cpp 785B
length.cpp 764B
initseq.cpp 758B
line.cpp 752B
narrow.cpp 725B
swap.cpp 704B
set_difference.cpp 701B
mbstatic.cpp 694B
initmap.cpp 686B
seek.cpp 663B
indirectarray.cpp 639B
operation.cpp 632B
set_union.cpp 619B
raw_write.cpp 603B
bounds.cpp 594B
shift.cpp 593B
init.cpp 588B
global.cpp 586B
insertseq.cpp 584B
foncteur.cpp 582B
string.cpp 581B
surcharge.cpp 576B
compare.cpp 572B
typeid.cpp 562B
complex4.cpp 556B
bitops.cpp 554B
auto_ptr.cpp 553B
iomanip.cpp 544B
traits1.cpp 542B
find_first_of.cpp 529B
maskarray.cpp 526B
slicearray.cpp 520B
partial_diff.cpp 519B
vecteurs.cpp 517B
set_terminate.cpp 515B
set_unexpected.cpp 507B
search.cpp 502B
itrevers.cpp 499B
constmember.cpp 497B
tailleheader.cpp 491B
complet.cpp 488B
listhead.cpp 480B
ptr_release.cpp 474B
equal.cpp 472B
set_intersection.cpp 464B
pair.cpp 461B
generate_n.cpp 458B
partition.cpp 454B
friendclass.cpp 449B
trycons.cpp 448B
file.cpp 447B
valeur.cpp 444B
ostrit.cpp 435B
accumulate.cpp 433B
instanciation.cpp 427B
init.cpp 420B
assign.cpp 408B
inplace_merge.cpp 398B
copy_backward.cpp 390B
remove.cpp 386B
adjacent_find.cpp 386B
cheaders.cpp 386B
inner_product.cpp 385B
transform.cpp 381B
共 146 条
- 1
- 2
资源评论
邓凌佳
- 粉丝: 65
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Pytorch-pytorch深度学习教程之深度残差网络.zip
- Pytorch-pytorch深度学习教程之循环神经网络.zip
- Pytorch-pytorch深度学习教程之逻辑回归.zip
- Pytorch-pytorch深度学习教程之双向循环网络.zip
- Pytorch-pytorch深度学习教程之卷积神经网络.zip
- Pytorch-pytorch深度学习教程之前馈神经网络.zip
- Pytorch-pytorch深度学习教程之线性回归.zip
- Pytorch-pytorch深度学习教程之基本操作.zip
- 基于QT的地图可视化桌面系统后台数据库为MySQL5.7源码.zip
- 基于simulink的PLL锁相环系统仿真【包括模型,文档,参考文献,操作步骤】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功