c语言链表的遍历、删除、插入等

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; 
} 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值