嵌入式Linux C语言 应用程序开发之通讯录(链表操作与数据库保存)

版权声明:版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/qq_37808895,未经博主允许不得转载。 https://blog.csdn.net/qq_37808895/article/details/88639371

sqlite3的安装

几乎所有Linux下都附带sqlite
Terminal下输入下列指令

sudo apt-get install sqlite3

等待下载安装

程序代码

通过新建链表保存联系人,建立数据库保存读取,菜单很简略,功能见效果图Terminal输入vim linkdata.c进行编写
i:编辑
命令行模式
:wq保存并退出

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sqlite3.h>
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!\n");
		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退出添加操作):\n");
	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("添加成功\n");

		/*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("请输入要修改的联系人姓名:\n");
	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("添加成功\n");
				return;
			}

		}
	printf("未找到该联系人\n");
}



void deleteone(Link * head)
{
	char str[30];
	Link p,q;
	p=*head;
	q=p->next;
	printf("请输入要删除的联系人姓名:\n");
	scanf("%s",str);
		while(q!=NULL)
		{
			
			if(strcmp(q->name,str)==0)
			{
				p->next=q->next;
				free(q);
				printf("删除成功!\n");
				return;
			}
			p=p->next;
			q=q->next;
		}
	printf("未找到该联系人\n");

}

void empty(Link * head)
{
	Link p;
	p=(*head)->next;
	if(p==NULL)
	{
		printf("联系人列表为空!\n");
	}
	else
	{
		while(p!=NULL)
		{
			(*head)->next=p->next;			
			free(p);
			p=(*head)->next;
		}
	printf("清空完成!\n");
	}
}

void exitall()
{
	exit(0);
}

void list(Link head)
{
		Link p;
		p=head->next;
		if(NULL==p)
		{
			printf("联系人列表为空!\n");
			return;
		}
		printf("全部联系人如下:\n");
		while(p!=NULL)
		{	
			
			printf("姓名:%s\n",p->name);
			printf("号码:%s\n",p->tele);
			printf("性别:%s\n",p->sex);
			printf("城市:%s\n",p->loca);

			printf("\n");
			
			p=p->next;
		}

}

void phone(Link head)
{
	char str[30];
	Link p;
	p=head;

	printf("请输入查找的联系人号码:\n");
	scanf("%s",str);
	while((p->next)!=NULL)
		{
			p=p->next;
			if(strcmp(p->tele,str)==0)
			{
				printf("姓名:%s\n",p->name);
				printf("号码:%s\n",p->tele);
				printf("性别:%s\n",p->sex);
				printf("城市:%s\n",p->loca);
				return;
			}
		}
	printf("未找到该联系人\n");
}

void seach(Link head)
{	
	char str[30];
	Link p;
	p=head;

	printf("请输入查找的联系人姓名:\n");
	scanf("%s",str);
	while((p->next)!=NULL)
		{
			p=p->next;
			if(strcmp(p->name,str)==0)
			{
				printf("姓名:%s\n",p->name);
				printf("号码:%s\n",p->tele);
				printf("性别:%s\n",p->sex);
				printf("城市:%s\n",p->loca);
				return;
			}
		}
	printf("未找到该联系人\n");

	
}





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\n",sqlite3_errmsg(db));
		exit(-1);
	}
	/*else
	{
		printf("open database successfully!\n");
	}*/

	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\n",errmsg);
		exit(-1);
	}


	sql="delete from linktable;";
	ret=sqlite3_exec(db,sql,NULL,NULL,&errmsg);
	if(ret != SQLITE_OK)
		printf("delete error\n");
	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\n");
			exit(1);
		}
			p=p->next;
	}
	printf("保存成功!\n");
	
	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\n",sqlite3_errmsg(db));
		exit(-1);
	}
	/*else
	{
		printf("open database successfully!\n");
	}*/

	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\n",row,column,i);
	for(j = 0;j < (row + 1) * column;j++)
	{
		printf("result[%d] = %s  ",j,result[j]);
		if((j+1) % column == 0)
		{
			printf("\n");
			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\n",sqlite3_errmsg(db));
		exit(-1);
	}
	/*else
	{
		printf("open database successfully!\n");
	}*/

	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\n",errmsg);
		exit(-1);
	}
	/*else
	{
		printf("create table successfully!\n");
	}*/



	readdata(&head);	
	
	while(1)
	{
			printf("			************************通讯录功能菜单*************************\n");
			printf("			*                                                    	      *\n");
			printf("			*       1.添加通讯录                  2.查看全部联系人        *\n");
			printf("			*       3.查找联系人资料              4.删除联系人            *\n");
			printf("			*       5.修改联系人                  6.清空全部联系人        *\n");
			printf("			*       7.查询号码联系人              8.保存全部联系人        *\n");
			printf("			*                           0.退出                            *\n");
			printf("			***************************************************************\n");
			printf("请输入1-8使用功能:(如键入非数字将执行上一操作)\n");
			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\n");break;
			}
			setbuf(stdin,NULL);
			
	}
	ret = sqlite3_close(db);
	if(SQLITE_OK != ret)
	{
		printf("关闭出错");
		exit(0);
	}
	return 0;
}


程序运行效果图

Terminal下输入下面指令进行链接

gcc linkdata.c -o linkdata -lsqlite3

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37808895/article/details/88639371