0
点赞
收藏
分享

微信扫一扫

单链表的结点删除并返回删除的值C语言数据结构

罗蓁蓁 2022-02-21 阅读 39

**单链表的结点删除并返回删除的值C语言数据结构

每一句基本上都有注释,如还有哪些细节不懂,欢迎下方评论

#include<stdio.h>
#include<stdlib.h> 

#define NULL 0
//创建单链表结构体 
typedef struct LNode{ 
	int data;						//表示结点的数据域 
	struct LNode * next;			//表示结点的指针域 
}LNode,*LinkList;
//声明ADT 
LinkList InitList_L(LinkList &L);
void GreateList_L(LinkList &L,int n);
LinkList ListDelete_L(LinkList &L,int del,int &e);
void Display_L(LinkList &L,int n);
//主函数,对数据的操作都在这里 
int main(){
	LinkList L;
	int n,del; 
	int * e;
	//对数据进行初始化 
	InitList_L(L);
	printf("请输入链表的长度:");
	scanf("%d",&n);
	//使用头插法创建链表 
	GreateList_L(L,n);
	printf("\n创建的");
	//将创建的链表打印出来 
	Display_L(L,n);
	printf("\n请输入要删除第几个节点:");
	scanf("%d",&del);
	//对链表中的某个结点进行删除 
	L = ListDelete_L(L,del,*e); 
	printf("\n删除结点的值为:%d",*e);
	printf("\n删除后的");
	Display_L(L,n);
	return 0;
	
} 
//链表的初始化,使链表变为只有头结点的链表 
LinkList InitList_L(LinkList &L){
	L=(LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	return L;
}
//创建链表 
void GreateList_L(LinkList &L,int n){
	//这里采用头插法,使用倒序输入 
	LinkList p;
	int i;
	//有的书上这里是对链表L进行头结点的分配内存
	//因为这个代码已经有初始化函数了,这里就不用再给头结点进行操作了
	//此时的链表中已经包含了头结点 
	for(i=n;i>0;--i){
		//为新节点分配内存 
		p = (LinkList)malloc(sizeof(LNode));
		printf("\n请输入链表的值:");
		scanf("%d",&p->data);
		//将头结点的下一个结点的地址赋值给要插入结点的指针域中
		//使得新结点位于链表的最前,头结点的后面 
		p->next = L->next;
		//将新插入的结点地址赋值给头结点的指针域,使得头结点和新结点进行连接 
		L->next = p; 
	}
}
//删除结点,并返回删除结点的数据 
LinkList ListDelete_L(LinkList &L,int del,int &e){
	LinkList p,q;
	p = L;
	//计数 
	int j = 0;
	//进入循环的条件为,链表不为空,且计数器要小于要删除结点的位置 
	while(p->next  && j<del-1){
		//p指针每次循环向后移动一位 
		p = p->next;
		//计数+1 
		j++;
	}
	//如果链表为空或者计数器大于要删除结点的位置,则返回该链表 
	if(!(p->next) || j>del+1){
		return L;
	}
	//使用一个空闲指针,将要删除结点的地址赋值给它 
	q = p->next;
	//再将要删除结点的下一个结点的地址赋值给要删除结点的前一个结点的指针域 
	p->next = q->next;
	//并将要删除结点的数据域赋值给该数据域指针类型,用于返回数据 
	e = q->data;
	//释放空闲指针 
	free(q);
	return L;
} 
//打印单链表 
void Display_L(LinkList &L,int n){
	LinkList p;
	int i;
	//首先将指针指向首元结点 
	p = L->next;
	printf("单链表为:");
	for(i=0;i<n;i++){
		printf("%d ",p->data);
		p = p->next;
		//每打印一个结点,指针向后移动一位 
	}
}
举报

相关推荐

0 条评论