你是我听过最美的童话。
最近,数据结构可上学习了链表线性表,并且用线性表实现了简单的手机通讯录,并用C语言和python语言都实现了,基本理论是一样的,贵在实践。记录一下~
class Node():
def __init__(self,name,old,telephone,email):
self.name = name
self.old = old
self.telephone = telephone
self.email = email
self.next = None
class phone_list():
def __init__(self):
self.head = Node(None,None,None,None)
self.len = 0
## 新建初始化 ##
def new_(self):
a = input("请输入姓名:")
while(len(a) > 4):
print("输入错误!请重新输入(姓名长度不得超过4)。")
a = input("请输入姓名:")
b = input("请输入年龄:")
while(1):
if int(b)>=1 and int(b)<=100:
break
print("输入错误!请重新输入(年龄范围:1~100)。")
b = eval(input("请输入年龄:"))
c = input("请输入电话:")
while(len(c) != 11):
print("输入错误!请重新输入:")
c = input("请输入电话:")
d = str(input("请输入邮箱:"))
while (1):
flag = 0
for i in range(len(d)):
if (d[-4:] ==".com") and (d[i] =="@"):
if d[i+1] != '.':
flag = 1
if flag==1:
break
print("输入错误!请检查邮箱格式是否正确。")
d = input("请输入邮箱:")
return a,b,c,d
def creat_people(self):
p =self.head
while 1:
a,b,c,d= self.new_()
new_peo = Node(a,b,c,d)
self.len+=1
p.next = new_peo
p = p.next
b = eval(input("是否继续添加?\n[1] 是[2] 否\n\n"))
if(b==1):
continue
elif(b==2):
break
## 遍历 ##
def scan_people(self):
if (self.len==0):
print("空无一人")
return
p = self.head
while(p.next):
print(f"姓名:{p.next.name},年龄:{p.next.old},电话:{p.next.telephone},邮件:{p.next.email}")
p = p.next
## 尾插法 插入新的节点 ##
def new_people(self):
p = self.head
while(p.next):
p = p.next
a,b,c,d = self.new_()
n_1 = Node(a,b,c,d)
self.len+=1
p.next = n_1
p = p.next
def find_people(self):
if (self.len==0):
print("空无一人")
return
a = input("请输入你要查询人的名字:")
p = self.head
while (p.next):
if(p.next.name==a):
break
else:
p = p.next
print("已找到!!!\n信息如下:\n")
print(f"姓名:{p.next.name},年龄:{p.next.old},电话:{p.next.telephone},邮箱:{p.next.email}")
def fix_people(self):
if self.len ==0:
print("空无一人")
return
a = input("请输入你要修改人的名字:")
p = self.head
while (p.next):
if(p.next.name==a):
break
else:
p = p.next
b = eval(input("请输入您要修改选项\n[1]姓名[2]年龄[3]电话[4]邮箱\n"))
if(b==1):
new_name = input("请输入修改后的姓名\n")
p.next.name = new_name
elif(b==2):
new_old = input("请输入修改后的年龄\n")
while(1):
if int(new_old)>=1 and int(new_old)<=100:
break
print("输入错误!请重新输入(年龄范围:1~100)。")
new_old = eval(input("请重新输入年龄:"))
p.next.old = new_old
elif(b==3):
new_tele = input("请输入电话:")
while(len(new_tele) != 11):
print("输入错误!请重新输入:")
new_tele = input("请输入电话:")
p.next.old = new_tele
elif(b==4):
new_email = str(input("请输入邮箱:"))
while (1):
flag = 0
for i in range(len(d)):
if (bew_email[-4:] ==".com") and (new_email[i] =="@"):
if d[i+1] != '.':
flag = 1
if flag==1:
break
print("输入错误!请检查邮箱格式是否正确。")
new_email = input("请输入邮箱:")
p.next.old = new_email
def del_people(self):
if self.len == 0:
print("空无一人")
return
a = input("请输入您要删除人的姓名:")
if(self.head.name == a):
self.head = self.head.next
self.len-=1
p = self.head
while(p.next):
if(p.next.name == a):
p.next = p.next.next
self.len-=1
break
else:
p = p.next
if(p.name == a):
p=None
self.len-=1
def length(self):
print(f"此通讯录共有{self.len}人")
def main():
PC = phone_list()
while True :
print("\n\n")
print('\t\t\tHPU计算机18实验班通讯录管理程序')
print('\t\t\t*\t python 类( 链表)实现\t *')
print("\t\t\t*\t\t\t *")
print("\t\t\t*\t功能查询:\t *")
print("\t\t\t*\t[1]:新建初始化\t *")
print("\t\t\t*\t[2]:新建\t *")
print("\t\t\t*\t[3]:查询\t *")
print("\t\t\t*\t[4]:删除\t *")
print("\t\t\t*\t[5]:显示组员\t *")
print("\t\t\t*\t[6]:修改信息\t *")
print("\t\t\t*\t[0]:退出\t *")
print("\t\t\t*** \t\t ***")
a =(input("请输入您的选择:"))
if a.isdigit():
a = int(a)
if(a>=0 and a<=6):
if (a==0):
print("谢谢您的使用!!!")
break
if (a==1):
PC.creat_people()
if (a==2):
PC.new_people()
if (a==3):
PC.find_people()
if (a==4):
PC.del_people()
if (a==5):
PC.scan_people()
if (a==6):
PC.fix_people()
x=eval(input("是否继续?\n【1】继续【2】退出"))
if x == 1 :
continue
if x==2 :
break
main()
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct stu_link
{
int id;
char name[10];
int age;
char telephone[20];
char email[20];
int len;
struct stu_link *next,*pre;
}stu;//定义结构体内变量
stu *head,*tail,*head_1,*tail_1,*head_2,*tail_2;//定义3个链表的头指针和尾指针
stu * creat_stu(stu *tail)//新建联系人
{
stu *p;
p = (stu *)calloc(sizeof(stu),1);
printf("请输入姓名:\n");
getchar();
gets(p->name);
while(strlen(p->name)>8)
{
printf("输入错误!\n请重新输入(名字长度小于等于4):");
gets(p->name);
}
printf("请输入年龄:\n");
scanf("%d",&p->age);
while(p->age>100||p->age<1)
{
printf("输入错误!\n请重新输入(1-100): ");
scanf("%d",&p->age);
}
printf("\n电话号码:");
getchar();
gets(p->telephone);
while(strlen(p->telephone)!=11)
{
printf("输入错误!\n请重新输入:");
gets(p->telephone);
}
printf("\n电子邮箱:");
getchar();
gets(p->email);
int i=0;
while(1)
{
int flag = 0;
int len;
for( i=0;i<20;i++)
{
len = strlen(p->email);
if(p->email[i]=='@'&&p->email[len-1]=='m'&&p->email[len-2]=='o'&&p->email[len-3]=='c'&&p->email[len-4]=='.'&&p->email[len-5]!='@')
flag=1;
}
if(flag==1)
break;
printf("输入错误!\n请重新输入:");
gets(p->email);
}
tail->next = p;
tail = p;
return tail;
}
stu * find_stu(stu *head,stu *tail,char a[10])//查找联系人并打印信息
{
stu *p;
p = head;
if(strcmp(tail->name,a)==0)
return tail;
int flag=0;
while(p->next != tail)
{
if(strcmp(p->name,a)==0)
{
flag = 1;
return p;
}
else
p = p->next;
}
if(!flag)
return NULL;
}
void scan_stu(stu *head,stu *tail)//浏览联系人信息
{
stu *p;
p = head->next;
while(p != tail)
{
printf("姓名: %s 年龄: %d 电话:%s 邮箱:%s\n",p->name,p->age,p->telephone,p->email);
p = p->next;
}
printf("姓名:%s 年龄: %d 电话:%s 邮箱:%s\n",tail->name,tail->age,tail->telephone,p->email);
}
stu * del_stu(stu *head,stu *tail)//删除指定联系人
{
stu *p,*q;
p = head->next;
printf("请输入要删除人的姓名\n");
char a[10];
scanf("%s",&a);
if(strcmp(p->name,a)==0)
{
head->next = p->next;
head->len--;
}
else if(strcmp(tail->name,a)==0)
{
while(p->next != tail)
p = p->next;
tail = p;
free(tail->next);
head->len--;
return tail;
}
else
{
while(p!=tail)
{
if(strcmp(p->name,a)==0)
break;
p = p->next;
}
q =p->next;
p->next = p->next->next;
head->len--;
free(q);
}
return tail;
}
void fix_stu(stu *head,stu *tail)//修改联系人信息
{
char a[10],aa[10],telephone1[20],email1[20];
int old;
stu *p;
printf("请输入要修改的姓名:\n");
scanf("%s",&a);
p = find_stu(head,tail,a);
printf("请输入要修改的信息\n[1]:姓名[2]:年龄[3]:电话[4]:邮箱\n");
int choice;
scanf("%d",&choice);
switch(choice)
{
case 1:{
printf("请输入修改后的姓名:\n");
getchar();
gets(aa);
while(strlen(aa)>8)
{
printf("输入错误!\n请重新输入(名字长度小于等于4):");
gets(aa);
}
strcpy(p->name,aa);
break;
}
case 2:{
printf("请输入修改后的年龄:\n");
scanf("%d",&old);
while(old>100||old<1)
{
printf("输入错误!\n请重新输入(1-100): ");
scanf("%d",&old);
}
p->age = old;
break;
}
case 3:{
printf("请输入修改后的电话:\n");
getchar();
gets(telephone1);
while(strlen(telephone1)!=11)
{
printf("输入错误!\n请重新输入:");
gets(telephone1);
}
strcpy(p->telephone,telephone1);
break;
}
case 4:{
printf("请输入修改后的邮箱:\n");
getchar();
gets(email1);
int i=0;
while(1)
{
int flag = 0;
int len;
for( i=0;i<20;i++)
{
len = strlen(email1);
if(email1[i]=='@'&&email1[len-1]=='m'&&email1[len-2]=='o'&&email1[len-3]=='c'&&email1[len-4]=='.'&&email1[len-5]!='@')
flag=1;
}
if(flag==1)
break;
printf("输入错误!\n请重新输入:");
gets(email1);
}
strcpy(p->email,email1);
break;
}
}
printf("修改成功!!!\n");
}
int main()
{
stu *head,*tail,*s,*head_1,*tail_1,*head_2,*tail_2;
head = (stu *)calloc(sizeof(stu),1);
head->len=0;
tail = head;
head_1 = (stu *)calloc(sizeof(stu),1);
head_1->len=0;
tail_1 = head_1;
head_2 = (stu *)calloc(sizeof(stu),1);
head_2->len=0;
tail_2 = head_2;
int choice;
while(1)
{
system("cls");
printf("\n\n\n");
printf("\t\t\t\t\t*****HPU计算机18实验班通讯录管理程序*****\n");
printf("\t\t\t\t\t+\t***C语言单向链表实现***\t\t+\n");
printf("\t\t\t\t\t+\t\t\t\t\t+\n");
printf("\t\t\t\t\t+\t\t\t\t\t+\n\t\t\t\t\t*\t 功能列表:\t\t\t+\n");
printf("\t\t\t\t\t+\t==========================\t+\n");
printf("\t\t\t\t\t+\t\t[1]:\t新建\t\t+\n");
printf("\t\t\t\t\t+\t\t[2]:\t查询\t\t+\n");
printf("\t\t\t\t\t+\t\t[3]:\t删除\t\t+\n");
printf("\t\t\t\t\t+\t\t[4]:\t显示组员\t+\n");
printf("\t\t\t\t\t+\t\t[5]:\t修改信息\t+\n");
printf("\t\t\t\t\t+\t\t[6]:\t总人数\t\t+\n");
printf("\t\t\t\t\t+\t\t[0]:\t退出\t\t+\n");
printf("\t\t\t\t\t+++\t========================== +++\n");
printf("\n选择你要的功能:\n");
scanf("%d",&choice);
if(choice==0)
{
printf("谢谢您的使用!!!\n");
break;
}
switch(choice)
{
case 1:
{
int choice1;
printf("是否进行分组?\n[1]:分组[2]:不分组\n");
scanf("%d",&choice1);
switch(choice1)
{
case 1:{
int choice2;
printf("请选择分组:\n[1]:家人[2]:朋友\n");
scanf("%d",&choice2);
switch(choice2)
{
case 1:{
tail_1 = creat_stu(tail_1);
head_1->len++;
break;
}
case 2:{
tail_2 = creat_stu(tail_2);
head_2->len++;
break;
}
}
break;
}
case 2:{
tail = creat_stu(tail);
head->len++;
break;
}
}
break;
}
case 2:
{
if(head->len==0&&head_1->len==0&&head_2->len==0)
{
printf("空无一人\n");
break;
}
char a[10];
int b;
printf("请输入要查找人的名字\n");
scanf("%s",&a);
printf("请选择您要查找的人位于哪个分组:\n[1]:家人[2]:朋友[3]:未分组");
scanf("%d",&b);
if(b==1)
{
s = find_stu(head_1,tail_1,a);
}
else if(b==2)
{
s = find_stu(head_2,tail_2,a);
}
else if(b==3)
{
s = find_stu(head,tail,a);
}
//s = find_stu(head,tail,a);
if(s != NULL)
printf("姓名:%s 年龄:%d 电话:%s 邮箱:%s\n",s->name,s->age,s->telephone,s->email);
else if(s==NULL)
printf("没有此人!\n");
break;
}
case 3:
{
if(head->len==0&&head_1->len==0&&head_2->len==0)
{
printf("空无一人\n");
break;
}
if(head->len==0)
printf("未分组空无一人\n");
else if(head_1==0)
printf("家人分组空无一人\n");
else if(head_2==0)
printf("朋友分组空无一人\n");
int b;
printf("请选择您要删除的人位于哪个分组:\n[1]:家人[2]:朋友[3]:未分组");
scanf("%d",&b);
if(b==1)
{
del_stu(head_1,tail_1);
head_1--;
}
else if(b==2)
{
del_stu(head_2,tail_2);
head_2--;
}
else if(b==3)
{
del_stu(head,tail);
head--;
}
break;
}
case 4:{
if(head->len==0&&head_1->len==0&&head_2->len==0)
{
printf("空无一人\n");
break;
}
if(head->len==0)
printf("未分组空无一人\n");
else if(head_1==0)
printf("家人分组空无一人\n");
else if(head_2==0)
printf("朋友分组空无一人\n");
if(head->len!=0)
scan_stu(head,tail);
if(head_1->len!=0)
scan_stu(head_1,tail_1);
if(head_2->len!=0)
scan_stu(head_2,tail_2);
break;
}
case 5:{
if(head->len==0&&head_1->len==0&&head_2->len==0)
{
printf("空无一人\n");
break;
}
if(head->len==0)
printf("未分组空无一人\n");
else if(head_1==0)
printf("家人分组空无一人\n");
else if(head_2==0)
printf("朋友分组空无一人\n");
int b;
printf("请选择您要查找的人位于哪个分组:\n[1]:家人[2]:朋友[3]:未分组\n");
scanf("%d",&b);
if(b==1)
fix_stu(head_1,tail_1);
else if(b==2)
fix_stu(head_2,tail_2);
else if(b==3)
fix_stu(head,tail);
break;
}
case 6:{
printf("此通讯录共有%d人\n",head->len+head_2->len+head_1->len);
break;
}
}
printf("ENTER键继续(可能不止两次优~~)");
getchar();
getchar();
}
return 0;
}