📄 txl.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NULL 0
#define LEN sizeof(LNode)
int length;
int seat;
typedef struct LNode
{
int number;
int telenum;
char name[20];
struct LNode *next;
}LNode,*LinkList;
//用于通讯录结点
/*****************************插入结点********************************/
LinkList prior(LinkList L,LinkList p)
{
if(L->next==NULL) return(L);
LinkList p_prior=L;
while(p_prior->next != p)
{
p_prior=p_prior->next;
}
return (p_prior);
} // 找到位于当前地址元素的前一元素的地址
void insertYuanXu(LinkList L,LinkList Elem)
{ //插入一个元素,使原有序表仍为有序
LinkList p=L->next;
while(p!=NULL && Elem->number>=p->number)
{
if(p->number==Elem->number)
{
printf(" 重复输入!!\n");return;
}
p=p->next;
} //确定Elem插入的位置
if(p==NULL) { p=prior(L,p); Elem->next=NULL;p->next=Elem;}
else //若为空表,插到头结点之后
{
p=prior(L,p); Elem->next=p->next; p->next=Elem;
}
}
/*****************************创建链表*****************************/
LinkList creatIncreLink() //创建一个非递减有序表,返回头结点地址
{
LinkList L=(LinkList)malloc(LEN); //头结点
L->next=NULL;
LinkList p;
int num=1;
int number,telenum;
char name[20];
printf(" 请输入学生学号、姓名和电话号码,建立通讯录,以'0'为输入结束标志\n");
printf(" Input number %d:",num);
scanf("%d",&number);
printf(" Input name %d: ",num);
char temp=getchar();
gets(name);
printf(" Input the telephone number %d:",num);
scanf("%d",&telenum);
while (number>0){
p=(LinkList)malloc(LEN); //新结点
p->number=number;
p->telenum=telenum;
strcpy(p->name,name);
insertYuanXu(L,p); //有序的插入新结点
num++;
printf(" Input number %d:",num);
scanf("%d",&number);
printf(" Input name %d: ",num);
temp=getchar();
gets(name);
printf(" Input the telephone number %d:",num);
scanf("%d",&telenum);
}
return(L);
}
/*********************************查找结点**********************************/
int searchNum(LinkList L,int n)
{ // 按学号查找通讯者
int flag=0;
LinkList p=L->next;
seat=1;
if(L->next==NULL) printf(" 该链表中没有元素,查找失败\n");
else
{
while(p !=NULL)
{
if(p->number<=n)
if(p->number==n)
{
flag=1;
printf(" 要查找的是第%d位通讯者:\n",seat);
printf(" Number: %d Name: %s TeleNo.:%d\n",p->number,p->name,p->telenum);
}
p=p->next;seat++;//!!!!
}
}
return flag;
}
/**********************************删除结点***********************************/
int deleteElem(LinkList L,int i) //从通讯录中删除第i个元素
{
LinkList p=L;
int j=0;
while (p->next!=NULL&&j<i-1)
{
p = p->next;j++;
}
if(!(p->next)||j>i-1)
{
printf(" 第%d个元素删除失败\n",i);return 0;
}
//判断i是否合法,i既不能大于元素的个数,也不能小于等于0
LinkList q = p->next;
p->next = q->next;
free(q); //释放删除的结点
return 1;
}
int delNum(LinkList L,int n)
{
int flag=0;
LinkList p=L->next;
seat=1;
if(p==NULL)
{
printf("该链表中没有元素,删除失败\n");
return 0;
}
while(p!=NULL)
{
if(p->number==n)
{
flag=1;
printf(" %d 被删除\n",p->number);
deleteElem(L,seat);
return 1;
}
else
{
p=p->next;
seat++;
}
}
}
/****************************输出链表*********************************/
void printList(LinkList L)
{ // 打印头结点地址为L的通讯录
printf("\n ---------------------------------------\n");
printf(" Number Name TelephoneNo.\n");
printf(" -----------------------------------------\n");
LinkList p=L;
int n=1;
if(L->next==NULL) printf(" 该链表中没有元素\n");
else
while(p->next !=NULL){
printf(" %2d %-9d",n,p->next->number);
printf(" %-7s %d\n",p->next->name,p->next->telenum);
p=p->next;
n++;
}
printf(" -----------------------------------------\n");
return ;
}
void main()
{
LinkList L;
printf("\n ☆====================☆=通讯录=☆=======================☆\n");
printf(" 以下为功能菜单,请键入数字,选择算法:(2,3,4,5,6功能建立在1的基础上)\n");
printf(" 功能 1 通讯录链表的建立:\n");
printf(" 功能 2 通讯者结点的插入:\n");
printf(" 功能 3 通讯者结点的查询:\n");
printf(" 功能 4 通讯者结点的删除:\n");
printf(" 功能 5 通讯录链表的输出:\n");
printf(" 功能 0 退出管理系统\n");
int flag=0;
int menu;
printf(" 请选择0-5:");
scanf("%d",&menu);
while(menu!=0)
{
switch(menu)
{
case 1:
{
L=creatIncreLink();
printf(" 建立通讯录:");
printList(L);
flag=1;
break;
}
case 2:
{
if(flag==1)
{
int number,telenum;
char name[20];
printf(" 请输入通讯者的学号和姓名:\n");
printf(" Input the number: ");
scanf("%d",&number);
printf(" Input the name: ");
char temp=getchar();
gets(name);
printf(" Input the telephone number: ");
scanf("%d",&telenum);
LinkList p=(LinkList)malloc(LEN); //新结点
p->number=number;
strcpy(p->name,name);
p->telenum=telenum;
insertYuanXu(L,p); //有序的插入新结点
printf(" 插入后:");
printList(L);
}
else printf("\n ERROR: 通讯录还没有建立,请先建立通讯录\n");
break;
}
case 3:
{
int n;
int s;
if(flag==1)
{
printf("\n Input the number:");
scanf("%d",&n);
s=searchNum(L,n);
if(s==0) printf(" 无此通讯者,查找失败!\n");
}
else printf(" ERROR!!!\n");
break;
}
case 4:
{
int n,f;
if(flag==1)
{
printf(" Input the number: ");
scanf("%d",&n);
f=delNum(L,n);
if(f!=0)
{
printf(" 删除后:\n");
printList(L);
}
else printf(" 无该学号,删除失败!\n");
}
else printf("ERROR!!!\n");break;
}
case 5:
{
printf(" 当前通讯录内容如下:\n");
printList(L);
break;
}
case 0:
exit(0);
default: printf("\n 没有此功能,重新输入\n");
}//switch
printf(" 选择功能:");
scanf("%d",&menu);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -