#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
//定义一个结构体
struct Student{
char name[20];
int number;
struct Student *next;
};
int main(){
//函数声明
struct Student * createLink();
void printLink(struct Student * pHead);
struct Student * insertLink(struct Student * pHead);
void deleteLink(struct Student * pHead);
void menu(struct Student * pHead);
//定义一个指针指向结构体的指针变量,为改结构体的头节点
struct Student * pHead=NULL;
menu(pHead);
}
void menu(struct Student * pHead){
int i;
printf("1.创建链表 2.为链表增加节点 3.删除链表的节点 4.打印链表\n");
printf("请输入操作指令:");
scanf("%d",&i);
switch(i){
case 1:
pHead=createLink();
printf("操作成功\n");
menu(pHead);
break;
case 2:
pHead=insertLink(pHead);
printf("操作成功\n");
menu(pHead);
break;
case 3:
deleteLink(pHead);
printf("操作成功\n");
menu(pHead);
break;
case 4:
printLink(pHead);
printf("操作成功\n");
menu(pHead);
break;
default:
printf("输入的参数不合法!\n");
menu(pHead);
break;
}
}
//创建链表
struct Student * createLink(){
//定义一个指向结构体的指针变量
struct Student * pHead=NULL;
//定义两个指向结构体的指针
struct Student *pOld,*pNew;
//分配一块内存,然后让两个指针指向它
pHead=pNew=pOld=(struct Student*)malloc(sizeof(struct Student));
printf("请输入一个学生的名字:");
scanf("%s",&pNew->name);
printf("请输入一个学生的学号:");
scanf("%d",&pNew->number);
while(pNew->number!=0){
pOld=pNew; //将旧的指针指向新的指针
pNew=(struct Student*)malloc(sizeof(struct Student));
printf("请输入一个学生的名字:");
scanf("%s",&pNew->name);
printf("请输入一个学生的学号:");
scanf("%d",&pNew->number);
pOld->next=pNew;
}
pOld->next=NULL;
free(pNew);
return pHead;
}
//打印链表中的元素
void printLink(struct Student * pHead){
while(1){
if(pHead!=NULL){
printf("学生的姓名为:%s,学生的学号为%d\n",pHead->name,pHead->number);
pHead=pHead->next; //将指针指向下一个节点
}else{
break;
}
}
}
//插入数据到链表中,pHead表示要插入的链表的头结点
struct Student * insertLink(struct Student * pHead){
//新建一个节点
struct Student * pNew,*pTemp;
pNew=(struct Student*)malloc(sizeof(struct Student));
printf("请输入姓名:");
scanf("%s",&pNew->name);
printf("请输入学号:");
scanf("%s",&pNew->number);
pTemp=pHead->next; //原来的pHead的节点的下一个节点的地址
pHead->next=pNew;
pNew->next=pTemp;
return pHead;
}
//删除链表,pHead为头结点指针,index为要删除的第几个节点
void deleteLink(struct Student * pHead){
int index;
int i;
struct Student * pTemp,*pTemp2,*pTemp3;
printf("请输入需要删除的节点的索引号:");
scanf("%d",&index);
pTemp2=pHead;
//删除第二个节点
for(i=0;i<index-1;i++){
pTemp3=pTemp2;
pTemp=pTemp2->next; //为第二个节点的指针
pTemp2=pTemp;
}
pTemp3->next=pTemp->next;
free(pTemp);
}
#include<stdlib.h>
#include<conio.h>
//定义一个结构体
struct Student{
char name[20];
int number;
struct Student *next;
};
int main(){
//函数声明
struct Student * createLink();
void printLink(struct Student * pHead);
struct Student * insertLink(struct Student * pHead);
void deleteLink(struct Student * pHead);
void menu(struct Student * pHead);
//定义一个指针指向结构体的指针变量,为改结构体的头节点
struct Student * pHead=NULL;
menu(pHead);
}
void menu(struct Student * pHead){
int i;
printf("1.创建链表 2.为链表增加节点 3.删除链表的节点 4.打印链表\n");
printf("请输入操作指令:");
scanf("%d",&i);
switch(i){
case 1:
pHead=createLink();
printf("操作成功\n");
menu(pHead);
break;
case 2:
pHead=insertLink(pHead);
printf("操作成功\n");
menu(pHead);
break;
case 3:
deleteLink(pHead);
printf("操作成功\n");
menu(pHead);
break;
case 4:
printLink(pHead);
printf("操作成功\n");
menu(pHead);
break;
default:
printf("输入的参数不合法!\n");
menu(pHead);
break;
}
}
//创建链表
struct Student * createLink(){
//定义一个指向结构体的指针变量
struct Student * pHead=NULL;
//定义两个指向结构体的指针
struct Student *pOld,*pNew;
//分配一块内存,然后让两个指针指向它
pHead=pNew=pOld=(struct Student*)malloc(sizeof(struct Student));
printf("请输入一个学生的名字:");
scanf("%s",&pNew->name);
printf("请输入一个学生的学号:");
scanf("%d",&pNew->number);
while(pNew->number!=0){
pOld=pNew; //将旧的指针指向新的指针
pNew=(struct Student*)malloc(sizeof(struct Student));
printf("请输入一个学生的名字:");
scanf("%s",&pNew->name);
printf("请输入一个学生的学号:");
scanf("%d",&pNew->number);
pOld->next=pNew;
}
pOld->next=NULL;
free(pNew);
return pHead;
}
//打印链表中的元素
void printLink(struct Student * pHead){
while(1){
if(pHead!=NULL){
printf("学生的姓名为:%s,学生的学号为%d\n",pHead->name,pHead->number);
pHead=pHead->next; //将指针指向下一个节点
}else{
break;
}
}
}
//插入数据到链表中,pHead表示要插入的链表的头结点
struct Student * insertLink(struct Student * pHead){
//新建一个节点
struct Student * pNew,*pTemp;
pNew=(struct Student*)malloc(sizeof(struct Student));
printf("请输入姓名:");
scanf("%s",&pNew->name);
printf("请输入学号:");
scanf("%s",&pNew->number);
pTemp=pHead->next; //原来的pHead的节点的下一个节点的地址
pHead->next=pNew;
pNew->next=pTemp;
return pHead;
}
//删除链表,pHead为头结点指针,index为要删除的第几个节点
void deleteLink(struct Student * pHead){
int index;
int i;
struct Student * pTemp,*pTemp2,*pTemp3;
printf("请输入需要删除的节点的索引号:");
scanf("%d",&index);
pTemp2=pHead;
//删除第二个节点
for(i=0;i<index-1;i++){
pTemp3=pTemp2;
pTemp=pTemp2->next; //为第二个节点的指针
pTemp2=pTemp;
}
pTemp3->next=pTemp->next;
free(pTemp);
}