c语言链表的遍历、删除、插入等
/*链表的增删查改*/
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
//定义学生人数作为全局变量,方便后面的录入、遍历等
int n;
//定义结构体变量
typedef struct PHT{
int data;
char name[10];
struct PHT* next; //结构体指针,也是一种结构体变量,它里面也有两个成员
}list,*plist; //使用typedef,即list等价于struct PHT plist等价于 struct PHT*
//建立表头的函数
plist LIANTOU(){
plist first=(plist)malloc(sizeof(list));
first->next=NULL;
return first;
}
//建立链表节点的函数
void JIEDIAN(plist P){ //P为表头指针,即first(它不是表头内部的指针域指针,而是指向表头节点的指针)
for(int i=0;i<n;i++){
plist nextd=(plist)malloc(sizeof(list)); //定义指针nextd指向新建的结构体地址
printf("\n请输入学号:");
scanf("%d",&nextd->data);
printf("\n请输入姓名:");
scanf("%s",nextd->name); //数组名本身就是地址,不用加 & 符号
nextd->next=NULL; //将新建的地址中的指针域赋值为null,指向空
P->next=nextd; // 将nextd指针所指向的地址赋给表头(节点)的指针域 P->next
P=P->next; //表头指针后移 (P->next->next->next......)
}
}
//链表的遍历函数(可从头指针开始进行)
void OUTPUTLIST(plist P){
if(P==NULL)
printf("没有数据");
else
printf("\n学号\t姓名\n");
while(P->next!=NULL){ //循环条件设置为遍历到最后一个节点,即指针域指向null的节点
P=P->next; //表头指针后移 (P->next->next->next......)
printf("%d\t%s\n",P->data,P->name);
}
}
//中间插入节点的函数
void INSERT(plist P){
plist insertnew=(plist)malloc(sizeof(list));
int a;
printf("\n请输入新的学号:");
scanf("%d",&insertnew->data);
printf("\n请输入新的名字:");
scanf("%s",insertnew->name); // 不加&
printf("\n请输入插入学号之前的学号:");
scanf("%d",&a);
while(P->next!=NULL){
if(P->data==a){
insertnew->next=P->next;
P->next=insertnew;
break;
}
P=P->next;
}
}
//删除节点函数 (中间节点)
void DELETE(plist P){
plist lastone=P; //指向上一个指针域
P=P->next; //指向第一个有数据的节点(指向lastone的下一个指针域)
int a,k=0;
printf("请输入想要删除的学号:");
scanf("%d",&a);
while(P->next!=NULL){
if(P->data==a){
lastone->next=P->next; //先将被删除节点的前后节点连接
free(P); //释放被删除节点的堆区
printf("\n该学号已被删除\n");
k=1;
break;
}
lastone=lastone->next; //lastone下移
P=P->next; //P下移
}
if(k=0) //添加k值,用来判断是否存在该学号
printf("\n该学号不存在");
}
/*主函数*/
int main(){
int del;
printf("/********学生管理系统********/\n\n");
printf("请输入学生个数:");
scanf("%d",&n);
plist haha=LIANTOU(); //建立头结点
JIEDIAN(haha); //建立后续节点
OUTPUTLIST(haha); //链表的遍历
/*删除节点*/
printf("\n需要删除请输入1,否则输入0 :");
scanf("%d",&del);
if(del==1)
DELETE(haha); //删除节点
OUTPUTLIST(haha); //删除完后再输出链表检测结果
/*插入*/
INSERT(haha);
OUTPUTLIST(haha); //插入完后再输出链表检测结果
return 0;
}