#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*定义student结构体并命名为STU*/
#define LONG sizeof(STU)
typedef struct student
{
int num;
char name[20];
char sex[4];
struct student *next;
}STU;
/*定义首链表结构体包含链表节点数member以及链表名NAME*/
typedef struct tile
{
int member;
char NAME[30];
struct student *next;
}HEAD;
void main()
{
int num ,index;
char name[20];
char sex[4];
char able;
HEAD head={0,"苏嵌154",NULL};
while(able != 'f')//利用while循环以及switch 语句制作一个简单的用户交互界面
{
printf("请选择要使用的功能\n");
printf("a:建立通讯录 b:查看通讯录 c:更改通讯录 d:删除通讯律所选节点 e:添加新节点f:退出通讯录\n");
scanf("%c",&able);
getchar();
switch(able)
{
case 'a':creat(&head);break;
case 'b':print(&head);break;
case 'c':
printf("请输入要修改的节点num:\n");scanf("%d",&num);getchar();
printf("请输入修改后的姓名name:\n");scanf("%s",name);getchar();
printf("请输入修改后的性别sex:\n");scanf("%s",sex);getchar();
change(&head,num,name,sex);break;
case 'd':
printf("请输入要删除的节点num:\n");scanf("%d",&num);getchar();
delet(&head,num);break;
case 'e':
printf("请输入要添加的节点num:\n");scanf("%d",&num);getchar();
printf("请输入要添加的姓名name:\n");scanf("%s",name);getchar();
printf("请输入要添加的性别sex:\n");scanf("%s",sex);getchar();
printf("请输入要添加的节点位置index:\n");scanf("%d",&index);getchar();
add(&head,num,name,sex,index);break;
case 'f':printf("你将退出通讯录\n");break;
default :printf("输入错误,请重新输入\n");break;
}
}
}
int creat(HEAD*head)//创建链表
{
STU*p1 = NULL,*p2 = NULL;
p1=p2=(STU*)malloc(LONG);
printf("please input information:\n");
printf("0:结束标志\n");
printf("please input num:");
scanf("%d",&p1->num);
getchar();
while(p1->num != 0)
{
(head->member)++;
printf("please input name:");
scanf("%s",p1->name);
getchar();
printf("please input sex:");
scanf("%s",p1->sex);
getchar();
if(1 == head->member)
{
head->next = p1;
}
else
p2->next = p1;
p2 = p1;
p1 = (STU*)malloc(LONG);
printf("please input num:");
scanf("%d",&p1->num);
getchar();
}
p2->next = NULL;
printf("通讯录创建结束\n");
return 0;
}
int print(HEAD*head)//打印链表
{
STU*p;
p = head->next;
printf("%s\n学生人数:%d\n",head->NAME,head->member);
if(head->next == NULL)
{
printf("the list is null\n");
}
else
for(;p != NULL;p = p->next)
{
printf("the num is:%d,the name is:%s,the sex is:%s.\n",p->num,p->name,p->sex);
}
return 0;
}
int change(HEAD*head,int num,char name[20],char sex[4])//改变链表指定位置的数据
{
STU*p;
p = head->next;
if(p == NULL)
{
printf("the list is null\n");
return 0;
}
for(;p != NULL;p = p->next)
{
if(p->num == num)
{
strcpy(p->name,name);
strcpy(p->sex,sex);
printf("通讯录已修改\n");
return 0;
}
}
printf("要修改的序号不存在\n");
return 0;
}
int delet(HEAD*head,int num)//删除链表指定位置的数据
{
STU*p1 = NULL,*p2 = NULL;
p2 = p1 = head->next;
if(NULL == p1)
{
printf("the list is null\n");
return 0;
}
for(;p1 != NULL;p2 = p1,p1 = p1->next)
{
if(p1->num == num)
{
if(p1 == head->next)
{
head->next = p1->next;
(head->member)--;
free(p1);
printf("所选节点已删除\n");
// return 0;
}
else
{
p2->next = p1->next;
(head->member)--;
free(p1);
printf("所选节点已删除\n");
// return 0;
}
p2 = p2->next;
for(;p2 != NULL;p2 = p2->next)
{
p2->num -= 1;
return 0;
}
}
}
printf("要删除的节点不存在\n");
return 0;
}
int add(HEAD*head,int num,char name[20],char sex[4],int index)//在链表指定位置增加一个节点当index为0时在头节点后插入
{
STU*p1 = NULL,*p2 = NULL;
p1 = head->next;
if(NULL == p1)
{
printf("the list is null\n");
return 0;
}
for(;p1 != NULL;p1 = p1->next)
{
if(index == p1->num)
{
p2=(STU*)malloc(LONG);
p2->num = num;
strcpy(p2->name,name);
strcpy(p2->sex,sex);
if(0 == index)
{
p2->next = p1;
head->next = p2;
(head->member)++;
return 0;
}
else
{
p2->next = p1->next;
p1->next = p2;
(head->member)++;
return 0;
}
}
}
printf("节点不存在\n");
return 0;
}
#include <stdlib.h>
#include <string.h>
/*定义student结构体并命名为STU*/
#define LONG sizeof(STU)
typedef struct student
{
int num;
char name[20];
char sex[4];
struct student *next;
}STU;
/*定义首链表结构体包含链表节点数member以及链表名NAME*/
typedef struct tile
{
int member;
char NAME[30];
struct student *next;
}HEAD;
void main()
{
int num ,index;
char name[20];
char sex[4];
char able;
HEAD head={0,"苏嵌154",NULL};
while(able != 'f')//利用while循环以及switch 语句制作一个简单的用户交互界面
{
printf("请选择要使用的功能\n");
printf("a:建立通讯录 b:查看通讯录 c:更改通讯录 d:删除通讯律所选节点 e:添加新节点f:退出通讯录\n");
scanf("%c",&able);
getchar();
switch(able)
{
case 'a':creat(&head);break;
case 'b':print(&head);break;
case 'c':
printf("请输入要修改的节点num:\n");scanf("%d",&num);getchar();
printf("请输入修改后的姓名name:\n");scanf("%s",name);getchar();
printf("请输入修改后的性别sex:\n");scanf("%s",sex);getchar();
change(&head,num,name,sex);break;
case 'd':
printf("请输入要删除的节点num:\n");scanf("%d",&num);getchar();
delet(&head,num);break;
case 'e':
printf("请输入要添加的节点num:\n");scanf("%d",&num);getchar();
printf("请输入要添加的姓名name:\n");scanf("%s",name);getchar();
printf("请输入要添加的性别sex:\n");scanf("%s",sex);getchar();
printf("请输入要添加的节点位置index:\n");scanf("%d",&index);getchar();
add(&head,num,name,sex,index);break;
case 'f':printf("你将退出通讯录\n");break;
default :printf("输入错误,请重新输入\n");break;
}
}
}
int creat(HEAD*head)//创建链表
{
STU*p1 = NULL,*p2 = NULL;
p1=p2=(STU*)malloc(LONG);
printf("please input information:\n");
printf("0:结束标志\n");
printf("please input num:");
scanf("%d",&p1->num);
getchar();
while(p1->num != 0)
{
(head->member)++;
printf("please input name:");
scanf("%s",p1->name);
getchar();
printf("please input sex:");
scanf("%s",p1->sex);
getchar();
if(1 == head->member)
{
head->next = p1;
}
else
p2->next = p1;
p2 = p1;
p1 = (STU*)malloc(LONG);
printf("please input num:");
scanf("%d",&p1->num);
getchar();
}
p2->next = NULL;
printf("通讯录创建结束\n");
return 0;
}
int print(HEAD*head)//打印链表
{
STU*p;
p = head->next;
printf("%s\n学生人数:%d\n",head->NAME,head->member);
if(head->next == NULL)
{
printf("the list is null\n");
}
else
for(;p != NULL;p = p->next)
{
printf("the num is:%d,the name is:%s,the sex is:%s.\n",p->num,p->name,p->sex);
}
return 0;
}
int change(HEAD*head,int num,char name[20],char sex[4])//改变链表指定位置的数据
{
STU*p;
p = head->next;
if(p == NULL)
{
printf("the list is null\n");
return 0;
}
for(;p != NULL;p = p->next)
{
if(p->num == num)
{
strcpy(p->name,name);
strcpy(p->sex,sex);
printf("通讯录已修改\n");
return 0;
}
}
printf("要修改的序号不存在\n");
return 0;
}
int delet(HEAD*head,int num)//删除链表指定位置的数据
{
STU*p1 = NULL,*p2 = NULL;
p2 = p1 = head->next;
if(NULL == p1)
{
printf("the list is null\n");
return 0;
}
for(;p1 != NULL;p2 = p1,p1 = p1->next)
{
if(p1->num == num)
{
if(p1 == head->next)
{
head->next = p1->next;
(head->member)--;
free(p1);
printf("所选节点已删除\n");
// return 0;
}
else
{
p2->next = p1->next;
(head->member)--;
free(p1);
printf("所选节点已删除\n");
// return 0;
}
p2 = p2->next;
for(;p2 != NULL;p2 = p2->next)
{
p2->num -= 1;
return 0;
}
}
}
printf("要删除的节点不存在\n");
return 0;
}
int add(HEAD*head,int num,char name[20],char sex[4],int index)//在链表指定位置增加一个节点当index为0时在头节点后插入
{
STU*p1 = NULL,*p2 = NULL;
p1 = head->next;
if(NULL == p1)
{
printf("the list is null\n");
return 0;
}
for(;p1 != NULL;p1 = p1->next)
{
if(index == p1->num)
{
p2=(STU*)malloc(LONG);
p2->num = num;
strcpy(p2->name,name);
strcpy(p2->sex,sex);
if(0 == index)
{
p2->next = p1;
head->next = p2;
(head->member)++;
return 0;
}
else
{
p2->next = p1->next;
p1->next = p2;
(head->member)++;
return 0;
}
}
}
printf("节点不存在\n");
return 0;
}