不带头结点的单链表的相关操作

#include<stdio.h>
#include<stdlib.h>  //malloc、free函数的头文件
typedef int ElemType;
typedef struct LNode{  //定义单链表结点类型 
	ElemType data;  //数据域
	struct LNode *next;  //指针域 
}LNode,*LinkList;//使用LNode *强调这是一个结点;使用LinkList强调这是一个单链表 

//1.初始化一个空的单链表(不带头结点)
bool InitList(LinkList &L){
	L = NULL;  //空表,暂时还没有任何结点(防止脏数据)
	return true;
}

//2.采用头插法建立一个单链表 
LinkList List_HeadInsert(LinkList &L){  //逆向建立单链表 
	LNode *s;
	int x;
	L = NULL;  //初始为空表 
	printf("请输入链表:(当输入9999是结束输入)\n");
	scanf("%d",&x);  //输入结点的值
	while(x!=9999){ //输入9999表示结束 
		s = (LNode *)malloc(sizeof(LNode));  //创建新结点
		s->data = x;
		s->next = L; 
		L = s;
		scanf("%d",&x);
	} 
	return L;
} 

//3.尾插法建立单链表(不带头结点)
LinkList List_TailInsert(LinkList &L){
    L = NULL;//初始化单链表,头指针L指向NULL
    LNode *s;//待插入新结点
    LNode *r = L;//r为表尾指针
    int x;//待插入新结点元素值
    printf("请输入链表:(当输入9999是结束输入)\n");
    scanf("%d",&x);//输入新结点
    while(x != 9999){//输入9999表示插入结束
        s = (LNode *)malloc(sizeof(LNode));//创建新结点
        s -> data = x;//新结点赋值
        if(L == NULL){//插入第一个结点时需要特殊处理
            L = s;
            r = s;
        }else{
            r -> next = s;
            r = s;//r指向新的表尾结点
        }
        scanf("%d",&x);
    }
    r -> next = NULL;//尾结点指针置空
}

//4.在第i个位置插入元素e(不带头结点)
bool ListInsert(LinkList &L,int i,int e){
	if(i<1)
		return false;
	if(i==1){  //插入在第1个结点的操作与其它结点不同 
		LNode *s = (LNode *)malloc(sizeof(LNode));
		s->data = e;
		s->next = L;
		L = s; 
	}
	LNode *p;  //指针p指向当前扫描的结点
	int j=1;  //当前p指向的是第几个结点
	p = L;   //p指向第1个结点(注意:不是头结点) 
	while(p!=NULL&&j<i-1){  //循环找到第i-1个结点 
		p = p->next;
		j++; 
	}
	if(p==NULL)  //i值不合法(超出单链表长度) 
		return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));  //创建一个新结点存储元素e
	s->data = e;
	//在p的后面插入s
	s->next = p->next;
	p->next = s;  //将s连到p的后面 
	return true;  //插入成功 
} 
 
//5.删除第i个结点,并把值带回(找第i-1个结点) 
bool ListDelete(LinkList &L,int i,int &e){ //&e为了把e的值带回去 
	if(i<1)
		return false;
	LNode *p;  //指针p指向当前扫描的结点
	int j = 1;  //当前p指向的是第几个结点
	p = L;   //p指向第1个结点(注意:不是头结点)
	while(p!=NULL&&j<i-1){  //循环找到第i-1个结点 
		p = p->next;
		j++; 
	}
	if(p==NULL)  //i值不合法(超出单链表长度) 
		return false;
	if(p->next == NULL)  //第i-1个结点后已无其它结点
		return false;
	LNode *q = p->next;  //用q指向被删除结点
	e= q->data;
	p->next = q->next;  //将*q从链中“断开” 
	free(q);  //释放结点的存储空间
	return true;  //删除成功 
} 

//打印单链表 
void PrintList(LinkList L) {
	LNode *p;	//创建一个指针p
	p = L;	//p指向第一个结点 
	printf("链表为:\n");
	while (p != NULL) {	//判断p是否为空
		printf("%d ", p->data);	//依次输入p的数据
		p = p->next;	//指针p每循环一次指向下一个结点元素
	}
	printf("\n");
}

int main(){
	LinkList L;//声明一个指向单链表的指针(注意,此处并没有创建结点)
	int e;  //声明变量e来存储被删除的结点 
	InitList(L);
	List_HeadInsert(L);
//	List_TailInsert(L); 
	ListDelete(L,3,e); 
	printf("被删除结点的值为:%d\n",e);
	PrintList(L);
	return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俊杰杰杰_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值