if(temp==NULL){
printf("插入位置无效\n");
returnp;
}
temp=temp->next;
}
//创建插入结点c
link*c=(link*)malloc(sizeof(link));
c->elem=elem;
//向链表中插入结点c->next=temp->next;temp->next=c;
returnp;
}
链表删除(Linkedlistdeletion从链表中删除指定数据元素时,中摘除,但作为一名合格的程序员,间要及时释放。
因此,从链表中删除数据元素需要进行以下2步操作:
1.将结点从链表中摘下来;
2.手动释放掉结点,回收被结点占用的存储空间;其中,从链表上摘除某节点的实现非常简单,只需找到该节点的直接前驱节点temp,执行一行程序:
temp->next=temp->next->next;
算法实现:
//p为原链表,add为要删除元素的值
link*delElem(link*p,intadd){
link*temp=p;
//temp指向被删除结点的上一个结点
for(inti=1;inext;
}
link*del=temp->next;//单独设置一个指针指向被删除结点,以防丢失temp->next=temp->next->next;//删除某个结点的方法就是更改前一个结点的指针域
free(del);//手动释放该结点,防止内存泄漏
returnp;
}
链表查找(Linklistlookup)的基本思想:
在链表中查找指定数据元素,最常用的方法是:
从表头依次遍历表中节点,用被查找元素与各节点数据域中存储的数据元素进行比对,直至比对成功或遍历至链表最末端的NULL(比对失败的标志)。
算法实现:
//p为原链表,elem表示被查找元素、
intselectElem(link*p,intelem){
//新建一个指针t,初始化为头指针p
link*t=p;
inti=1;
//由于头节点的存在,因此while中的判断为t->next
while(t->next){
t=t->next;
if(t->elem==elem){
returni;
}
i++;
}
//程序执行至此处,表示查找失败
return-1;
}
三、课程设计中遇到的难点及解决办法问题:
对数据进行增删改查后,如何将改变的数据同步到文件?
解决方法:
在退出函数前面设置一个保存文件的函数,这样无论数据发生怎样的变化,都会在结尾时,随着退出函数的实现而实现。
问题:
如何查找对应的数据?
解决方法:
因为所设置的结构体内的数据是字符型的,所以需要添加一个头文件,然后使用字符处理函数来对数据进行处理,之后就能够找到相关的数据.
四、总结
通过此次课程设计,加深了我对链表使用的熟练度,巩固了c语言。
让我回忆起了字符数组,文件操作,指针等课程知识。
我对此次课程设计获益匪浅。
课程设计是巩固所学知识理论,提高程序设计的重要环节,通过课程设计的训练,使我们能够综合应用数据结构的基础知识,加深了对于所学知识的理解,也更加懂得了实践的重要性,也明白了各种算法重要的是理解其原理,而不是死记硬背!
同时让我们更加了解自身不足和知识学习缺陷,从而不断完善自我,提高自己的学习水平。
在设计过程中我们真正实现了把所学知识运用于实践,逐渐培养自己的思维和逻辑能力以及实践能力,做到学以致用。
五、结论
通讯录的制作可以使用多种方式,函数调用,数据结构,类等等每一种制作方式都可以实现。
使用数据结构中链表的好处就是,什么时候存储数据,什么时候就能申请存储空间。
而且数据之间的逻辑关系依靠每个数据元素携带的指针维持,关系明确。
另一点,通讯录制作的问题主要涉及元素的插入,删除。
它进行这些操作时无需大量移动元素,时间复杂度相对较低。
不同的场景,选择合适的存储结构会使解决问题效率成倍数地提高。
六、附录—主要源程序代码及运行结果
#include
#include
#include
#includetypedefstructLine{
charname[51];
charcell_number[51];structLine*next;
}line;
//初始化
line*initLine()
{
line*p=(line*)malloc(sizeof(line));
line*temp=p;
temp->next=NULL;
returnp;
}
//插入尝试无脑插(尾插)
line*insertLine(line*p)
{
line*temp=p;
line*newelem=(line*)malloc(sizeof(line));
printf("\t\t请输入要插入的数据姓名手机号\n");scanf("%s",&newelem->name);
scanf("%s",&newelem->cell_number);newelem->next=NULL;
newelem->next=temp->next;temp->next=newelem;
printf("插入成功!
\n");
returnp;
}
//数据保存到文件
voidsaveFile(line*p)
{
line*temp=p->next;
通讯录存储处.txt","at+");
while(temp)
{
fprintf(fp,"%s%s\n",temp->name,temp->cell_number);temp=temp->next;
}
fclose(fp);
printf("保存成功\n");
}
//姓名查询
voidselectLine_name(line*p,char*elem)
{
Line*temp=p;
inti=1;
temp=temp->next;while(temp->next)
{if(strcmp(temp->name,elem)==0)//姓名查找位置{
printf("姓名:
%s,手机号:
%s\n",temp->name,temp->cell_number);}temp=temp->next;
}
}
//手机号查询
voidselectLine_Id(line*p,char*elem_num)
{
line*temp=p;
inti=1;temp=temp->next;
while(temp->next)
{
if(strcmp(temp->cell_number,elem_num)==0)
{
printf("姓名:
%s,手机号:
%s\n",temp->name,temp->cell_number);}temp=temp->next;
}
}
//使用姓名进行修改
line*amendLine_name(line*p,char*name){
line*temp=p;
temp=temp->next;
while(temp->next)
{if(strcmp(temp->name,name)==0)
{
printf("请对该账号进行重新修改\n");
scanf("%s%s",&temp->name,&temp->cell_number);
printf("修改成功!
\n");
}
temp=temp->next;
}
returnp;
//
使用手机号进行修改
line*amendLine_num(line*p,char*name_num){
line*temp=p;temp=temp->next;while(temp->next){
if(strcmp(temp->cell_number,name_num)==0)
{
printf("请对该账号进行重新修改\n");
scanf("%s%s",&temp->name,&temp->cell_number);
printf("修改成功!
\n");
}
temp=temp->next;
}
returnp;
}
//line*delLine(line*p)
{
无脑删
删除刚刚插入的数据)
类似于(栈)那种情况
line*temp=p;
line*del=temp->next;
temp->next=temp->next->next;
free(del);
printf("删除成功\n");returnp;
}
//指定名字删除
intselect_name(line*p,char*name)
{
line*temp=p;
inti=1;
//temp=temp->next;
while(temp->next)
{
temp=temp->next;
if(strcmp(temp->name,name)==0)
{
returni;
}
i++;
}
return-1;
}
//指定手机号删除
intselect_ID(line*p,char*name)
{
line*temp=p;
inti=1;
//temp=temp->next;
while(temp->next)
{
temp=temp->next;
if(strcmp(temp->cell_number,name)==0)
{
returni;
}
i++;
}
return-1;
}
//删除(执行两种删除的最终操作)
line*delLine_1(line*p,intadd)
{
line*del;
line*temp=p;
//intadd=select(p,name);
for(inti=1;i{
temp=temp->next;
}
del=temp->next;
temp->next=temp->next->next;free(del);
printf("删除完成\n");
returnp;
}
//显示
voiddisplay(line*p)
{
line*temp=p;
printf("\t\t显示全部数据\n");
while(temp->next)
{
temp=temp->next;
printf("\t\t%s%s\n",temp->name,temp->cell_number);}
}
voidzcd()//主菜单
{
printf("\t\t\t==========
电话本号码查询系统==========
printf("\t\t\t
1.
添加新联系人\n");
printf("\t\t\t
2.
修改联系人信息
\n");
printf("\t\t\t
3.
删除联系人信息
\n");
printf("\t\t\t
4.
联系人信息查询
\n");
printf("\t\t\t
5.
联系人信息显示
\n");
printf("\t\t\tprintf("\t\t\t===
0.
退出\n");
==\n");
}
voidfh()
{
printf("\t=====>按Enter返回主菜单\n");}
intmain()
{
line*p=initLine();
intchoose;
intadd=0;
//文件操作
FILE*fp;
通讯录存储处.txt","at+");printf("文件创建成功\n");
//文件操作
while
(1)
{
zcd();printf("\t\t\t请选择(0-5):
");
scanf("%d",&choose);system("cls");switch(choose)
{
case1:
//添加新联系人
p=insertLine(p);
//infile(p);//写入文件
fh();
break;
case2:
//修改联系人信息
printf("请输入你要修改帐号的方式0:
使用姓名进行修改1:
手机号进行修改\n");
charname[51];
charname_num[51];
scanf("%d",&choose);
switch(choose)
{
//
case0:
//添加新联系人
printf("请输入您要修改账号的姓名:
\n");
scanf("%s",&name);p=amendLine_name(p,name);
break;
//
case1:
//修改联系人信息
printf("请输入您要修改帐号的手机号\n");
scanf("%s",&name_num);
p=amendLine_num(p,name_num);
break;
default:
break;
}
fh();
break;
//
case3:
//删除联系人信息
printf("请您输入进行删除操作的方式:
0:
删除刚插入的数据指定名字删除2:
指定手机号删除\n");
scanf("%d",&choose);
chardelname[51];
chardelId[51];
switch(choose)
{
case0:
p=delLine(p);//无脑删
break;
case1:
printf("请输入您要进行删除操作的名字\n");scanf("%s",&delname);add=select_name(p,delname);
p=delLine_1(p,add);
使用
1:
break;case2:
printf("请您输入要进行删除操作的手机号\n");scanf("%s",&delId);
add=select_ID(p,delId);p=delLine_1(p,add);
break;
}
fh();
break;
//
case4:
//联系人信息查询
printf("请输入你要选择查询的方式0:
姓名查询,1:
手机号查询\n");
scanf("%d",&choose);
charelem[51];
charelem_num[51];
switch(choose)
{
case0:
printf("请输入您要查询账号的姓名:
\n");
scanf("%s",&elem);
selectLine_name(p,elem);
break;
case1:
printf("请输入您要查询帐号的手机号\n");
scanf("%s",&elem_num);
selectLine_Id(p,elem_num);
break;
default:
break;
}
fh();
break;
//
case5:
//显示
display(p);
fh();
break;
case0:
//退出
saveFile(p);
exit(0);
break;default:
break;
}
fflush(stdin);getchar();
system("cls");
}fclose(fp);
添加数据记录功能:
查询数据记录功能:
显示数据记录:
文件保存功能:
此处介绍:
文件功能设置为:
以读/写方式打开一个文本文件,允许读或在文本末追加数据.数据检查为第十次