嵌入式Linux C语言 应用程序开发之通讯录(链表操作与数据库保存)
2019-07-13 06:18发布
生成海报
目录
sqlite3的安装
几乎所有Linux下都附带sqlite
Terminal下输入下列指令
sudo apt-get install sqlite3
等待下载安装
程序代码
通过新建链表保存联系人,建立数据库保存读取,菜单很简略,功能见效果图Terminal输入vim linkdata.c进行编写
i:编辑
命令行模式
:wq保存并退出
#include
#include
#include
#include
struct contact
{
char name[30];
char tele[30];
char sex[30];
char loca[30];
struct contact * next;
};
typedef struct contact SCT;
typedef struct contact * Link;
void create_node(Link * new_node)
{
*new_node = (Link)malloc(sizeof(SCT));
if(*new_node == NULL)
{
printf("malloc erroc!
");
exit(-1);
}
}
void create_link(Link * head)
{
create_node(head);
(*head)->next=NULL;
}
void add(Link * head)
{
int num,i;
Link new_node;
Link p,q;
printf("请输入要添加的联系人个数(最多十个,输入0退出添加操作):
");
scanf("%d",&num);
setbuf(stdin,NULL);
while(num>10||num<0)
{
printf("输入错误请重新输入:");
setbuf(stdin,NULL);
scanf("%d",&num);
}
if(num==0)
{
return;
}
for(i=0;i<num;i++)
{
create_node(&new_node);
printf("请输入第%d个联系人姓名(eg:wang):",i+1);
scanf("%s",new_node->name);
printf("请输入第%d个联系人号码(eg:12345678901):",i+1);
scanf("%s",new_node->tele);
printf("请输入第%d个联系人性别(eg:男 女):",i+1);
scanf("%s",new_node->sex);
printf("请输入第%d个联系人城市(eg:nanjing):",i+1);
scanf("%s",new_node->loca);
printf("添加成功
");
p=*head;
q=p->next;
while( (q != NULL) && (q->name)[0] < (new_node->name)[0] )
{
p=q;
q=q->next;
}
if(q==NULL)
{
p->next=new_node;
new_node->next=NULL;
}
else
{
p->next=new_node;
new_node->next=q;
}
}
}
void alter(Link *head)
{
char str[30];
Link p;
p=*head;
printf("请输入要修改的联系人姓名:
");
scanf("%s",str);
while((p->next)!=NULL)
{
p=p->next;
if(strcmp(p->name,str)==0)
{
printf("请输入联系人%s的号码(eg:12345678901):",p->name);
scanf("%s",p->tele);
printf("请输入联系人%s性别(eg:1男 2女):",p->sex);
scanf("%s",p->sex);
printf("请输入联系人%s城市(eg:nanjing):",p->loca);
scanf("%s",p->loca);
printf("添加成功
");
return;
}
}
printf("未找到该联系人
");
}
void deleteone(Link * head)
{
char str[30];
Link p,q;
p=*head;
q=p->next;
printf("请输入要删除的联系人姓名:
");
scanf("%s",str);
while(q!=NULL)
{
if(strcmp(q->name,str)==0)
{
p->next=q->next;
free(q);
printf("删除成功!
");
return;
}
p=p->next;
q=q->next;
}
printf("未找到该联系人
");
}
void empty(Link * head)
{
Link p;
p=(*head)->next;
if(p==NULL)
{
printf("联系人列表为空!
");
}
else
{
while(p!=NULL)
{
(*head)->next=p->next;
free(p);
p=(*head)->next;
}
printf("清空完成!
");
}
}
void exitall()
{
exit(0);
}
void list(Link head)
{
Link p;
p=head->next;
if(NULL==p)
{
printf("联系人列表为空!
");
return;
}
printf("全部联系人如下:
");
while(p!=NULL)
{
printf("姓名:%s
",p->name);
printf("号码:%s
",p->tele);
printf("性别:%s
",p->sex);
printf("城市:%s
",p->loca);
printf("
");
p=p->next;
}
}
void phone(Link head)
{
char str[30];
Link p;
p=head;
printf("请输入查找的联系人号码:
");
scanf("%s",str);
while((p->next)!=NULL)
{
p=p->next;
if(strcmp(p->tele,str)==0)
{
printf("姓名:%s
",p->name);
printf("号码:%s
",p->tele);
printf("性别:%s
",p->sex);
printf("城市:%s
",p->loca);
return;
}
}
printf("未找到该联系人
");
}
void seach(Link head)
{
char str[30];
Link p;
p=head;
printf("请输入查找的联系人姓名:
");
scanf("%s",str);
while((p->next)!=NULL)
{
p=p->next;
if(strcmp(p->name,str)==0)
{
printf("姓名:%s
",p->name);
printf("号码:%s
",p->tele);
printf("性别:%s
",p->sex);
printf("城市:%s
",p->loca);
return;
}
}
printf("未找到该联系人
");
}
void save(Link *head)
{
sqlite3 *db;
char *sql;
char sql1[100];
char *errmsg;
int ret;
Link p;
FILE *fp;
p=(*head)->next;
ret = sqlite3_open("Linkdatabase.db",&db);
if(ret!=SQLITE_OK)
{
printf("open database error:%s
",sqlite3_errmsg(db));
exit(-1);
}
sql = "create table if not exists linktable(name text primary key,tele text,sex text,loca text);";
ret=sqlite3_exec(db,sql,NULL,NULL,&errmsg);
if(ret != SQLITE_OK)
{
printf("create table fail!:%s
",errmsg);
exit(-1);
}
sql="delete from linktable;";
ret=sqlite3_exec(db,sql,NULL,NULL,&errmsg);
if(ret != SQLITE_OK)
printf("delete error
");
while( p != NULL)
{
sprintf(sql1,"insert into linktable (name,tele,sex,loca) values('%s','%s','%s','%s');",p->name,p->tele,p->sex,p->loca);
ret=sqlite3_exec(db,sql1,NULL,NULL,&errmsg);
if(ret != SQLITE_OK)
{
printf("insert error
");
exit(1);
}
p=p->next;
}
printf("保存成功!
");
sqlite3_close(db);
}
void readdata(Link *head)
{
Link p=*head;
Link new_node;
int row,column;
char **result;
char *sql,*sql1[1000];
char *errmsg;
int ret;
int i=1;
sqlite3 *db=NULL;
ret=sqlite3_open("Linkdatabase.db",&db);
if(ret!=SQLITE_OK)
{
printf("open database error:%s
",sqlite3_errmsg(db));
exit(-1);
}
sql = "select * from linktable;";
ret = sqlite3_get_table(db,sql,&result,&row,&column,&errmsg);
if(ret != SQLITE_OK)
{
printf("get table error:%s",errmsg);
exit(-1);
}
do{
create_node(&new_node);
if(i>row)
{
break;
}
strcpy(new_node->name,result[i * column]);
strcpy(new_node->tele,result[i * column+1]);
strcpy(new_node->sex,result[i * column+2]);
strcpy(new_node->loca,result[i * column+3]);
p->next=new_node;
new_node->next=NULL;
p=p->next;
create_node(&new_node);
i++;
}while(1);
sqlite3_free_table(result);
}
int main()
{
Link head;
int n;
int ret;
sqlite3 * db=NULL;
char *sql,*sql1;
char *errmsg;
create_link(&head);
ret=sqlite3_open("Linkdatabase.db",&db);
if(ret!=SQLITE_OK)
{
printf("open database error:%s
",sqlite3_errmsg(db));
exit(-1);
}
sql1 = "create table if not exists linktable(name text primary key,tele text,sex text,loca text);";
ret=sqlite3_exec(db,sql1,NULL,NULL,&errmsg);
if(ret != SQLITE_OK)
{
printf("create table fail!:%s
",errmsg);
exit(-1);
}
readdata(&head);
while(1)
{
printf(" ************************通讯录功能菜单*************************
");
printf(" * *
");
printf(" * 1.添加通讯录 2.查看全部联系人 *
");
printf(" * 3.查找联系人资料 4.删除联系人 *
");
printf(" * 5.修改联系人 6.清空全部联系人 *
");
printf(" * 7.查询号码联系人 8.保存全部联系人 *
");
printf(" * 0.退出 *
");
printf(" ***************************************************************
");
printf("请输入1-8使用功能:(如键入非数字将执行上一操作)
");
scanf("%d",&n);
setbuf(stdin,NULL);
switch(n)
{
case 0:system("clear");exitall();break;
case 1:system("clear");add(&head);break;
case 2:system("clear");list(head);break;
case 3:system("clear");seach(head);break;
case 4:system("clear");deleteone(&head);break;
case 5:system("clear");alter(&head);break;
case 6:system("clear");empty(&head);break;
case 7:system("clear");phone(head);break;
case 8:system("clear");save(&head);break;
default:system("clear");printf("default
");break;
}
setbuf(stdin,NULL);
}
ret = sqlite3_close(db
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮