关于C结构体和单向链表的一个小demo
完全是命令行的,估计大二的时候会让写一个关于链表和结构体的东西,这里记录一下,之前写过一个双向循环链表的,这里就不贴了,原理都差不多,多了一个指针而已
逻辑是最重要的,逻辑是重要的,逻辑是重要的,重要的事要说三遍,还要用个大字体
完全的命令行模式,开始会让先输入4个人的信息,姓名,地址,电话,年龄,为了程序的美观,尽量不要输入中文,排版字符占位不一样
废话不多说,贴代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
typedef struct studentInfor
{
char name[20];
int age;
char address[50];
char phoneNumber[11];
struct studentInfor *next;
}SI;
void printfInfor(SI * listHead)
{
SI *p =(SI *)malloc (sizeof(SI));
p=listHead;
printf("姓名 年龄 地址 联系方式\n");
while(p->next!=NULL)
{
p=p->next;
printf("%-20s%-10d%-60s%-11s\n",p->name,p->age,p->address,p->phoneNumber);
}
}
SI* inputInfor()
{
SI *node=(SI *) malloc ( sizeof(SI) );
char name[20];
char address[50];
char phoneNumber[11];
int age=0;
if( node != NULL)
{
while(1)
{
printf("请输入姓名,20位以内\n");
scanf("%s",name);
getchar();
if(strlen(name)<20)
{
strcpy( node->name , name);
break;
}else
printf("输入的位数不符合要求");
}
while(1)
{
printf("请输入地址,50位以内\n");
scanf("%s",address);
getchar();
if(strlen(address)<50)
{
strcpy( node->address , address);
break;
}else
printf("输入的位数不符合要求");
}
while(1)
{
printf("请输入电话号码,11位\n");
scanf("%s",phoneNumber);
getchar();
if(strlen(phoneNumber)<11)
{
strcpy( node->phoneNumber , phoneNumber);
break;
}else
printf("输入的位数不符合要求");
}
printf("请输入年龄\n");
scanf("%d",&age);
getchar();
if(age>150)
{
printf("年龄太大,不符合要求\n");
}
node->age=age;
node->next=NULL;
}
return node;
}
void addInfor(SI *listHead)
{
SI *p=(SI *)malloc (sizeof(SI));
p=listHead;
SI *newNode=(SI *)malloc(sizeof(SI));
newNode=inputInfor();
while(p->next!=NULL)
{
p=p->next;
}
if(p->next==NULL)
p->next=newNode;
newNode->next=NULL;
printfInfor(listHead);
}
int searchInfor(SI *listHead , char *name,int isDel,int isModify)
{
SI *p=(SI *)malloc (sizeof(SI));
p=listHead;
SI *q=(SI *)malloc (sizeof(SI));
while(p->next!=NULL)
{
q=p;
p=p->next;
if(strcmp(p->name,name)==0)
{
printf("找到相应联系人\n\n");
printf("%s,%d,%s,%s\n",p->name,p->age,p->address,p->phoneNumber);
if(isModify == 1)
{
SI *modify=(SI *)malloc(sizeof(SI));
modify=inputInfor();
strcpy(p->name,modify->name);
strcpy(p->address,modify->address);
strcpy(p->phoneNumber,modify->phoneNumber);
p->age=modify->age;
printf("修改为\n");
free(modify);
printf("%s,%d,%s,%s\n",p->name,p->age,p->address,p->phoneNumber);
return 1;
}
if(isDel==1)
{
printf("是否真的要删除这条信息[Y/N]");
char a;
scanf("%c",&a);
getchar();
if(a=='Y')
{
q->next=p->next;
p=q->next;
printfInfor(listHead);
return 1;
}
}
return 1;
}
}
if(p->next==NULL)
{
if(strcmp(p->name,name)==0)
{
printf("%s,%d,%s,%s\n",p->name,p->age,p->address,p->phoneNumber);
if(isModify == 1)
{
SI *modify1=(SI *)malloc(sizeof(SI));
modify1=inputInfor();
strcpy(p->name,modify1->name);
strcpy(p->address,modify1->address);
strcpy(p->phoneNumber,modify1->phoneNumber);
p->age=modify1->age;
free(modify1);
p->next=NULL;
printfInfor(listHead);
return 1;
}
if(isDel==1)
{
printf("是否真的要删除这条信息[Y/N]");
char a;
scanf("%c",&a);
getchar();
if(a=='Y')
{
q->next=NULL;
printfInfor(listHead);
return 1;
}
}
return 1;
}
}
return -1;
}
int main(int argc,const char *argv[])
{
SI *list=(SI *)malloc(sizeof(SI));
if(list == NULL)
{
return 0;
}
char name[20];
list->next=NULL;
printf("为使系统正常工作,请先添加4个人员\n");
addInfor(list);
addInfor(list);
addInfor(list);
addInfor(list);
while(1)
{
printf("\n\n");
printf("***********************************************************\n");
printf(">>>>>>>>>>>>>>小型学生管理系统>>>>>>>>>>>>>>>\n");
printf("菜单列表:\n");
printf("1:添加信息\n");
printf("2:修改信息\n");
printf("3:删除信息\n");
printf("4:查询信息\n");
printf("5:退出\n");
printf(">>>>>>>>>>>>>>小型学生管理系统>>>>>>>>>>>>>>>\n");
printf("***********************************************************\n\n");
printf("请输入选项:\n");
int a=0;
scanf("%d",&a);
getchar();
switch(a)
{
case 1:
addInfor(list);break;
case 2:
printf("请输入要修改的名字:");
scanf("%s",name);
getchar();
if(searchInfor(list,name,0,1)==-1)
{
printf("没有相关人员,请确认后在修改\n");
}
printfInfor(list);
break;
case 3:
printf("请输入要删除的名字:");
scanf("%s",name);
getchar();
if(searchInfor(list,name,1,0)==-1)
{
printf("没有相关信息,无法删除\n");
}
break;
case 4:
printf("请输入要查找的名字:");
scanf("%s",name);
getchar();
if(searchInfor(list,name,0,0)==-1)
{
printf("没有找到相关人员,请确认后查找\n");
}
break;
case 5:
return 0;
break;
}
}
return 0;
}
大概就这么多了,关于双向循环链表的话,道理是一样的,多一个指针,而且搜索查询要快一点,毕竟是从两端开始查询的,大家可以自己编写,这里就不赘述了.
这里没有对内存做释放,虽然可以运行,但还是有瑕疵的,大家可以修改下
毕竟C是基础,好好学吧