嵌入式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; // int n,t,s,l; 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; while((p->next)!=NULL) { p=p->next; } p->next=new_node; new_node->next=NULL;*/ 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("请输入联系人姓名(eg:wang):"); scanf("%s",p->name);*/ 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); } /*else { printf("open database successfully! "); }*/ 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; //int j; sqlite3 *db=NULL; ret=sqlite3_open("Linkdatabase.db",&db); if(ret!=SQLITE_OK) { printf("open database error:%s ",sqlite3_errmsg(db)); exit(-1); } /*else { printf("open database successfully! "); }*/ 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); } /*printf("row:%d column:%d i:%d ",row,column,i); for(j = 0;j < (row + 1) * column;j++) { printf("result[%d] = %s ",j,result[j]); if((j+1) % column == 0) { printf(" "); continue; } }*/ 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); } /*else { printf("open database successfully! "); }*/ 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); } /*else { printf("create table successfully! "); }*/ 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