關於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是基礎,好好學吧