数据结构(C语言版)代码详解02-单循环链表

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

/***单链表的结构体:
头结点的data是整个链表的结点个数(不包括头结点)
头结点的next是指向链表的第一个结点地址(从这个结点开始才是正式的数据) 
***/
typedef struct Node{
	int data;
	struct Node* next;
}Node;//重定义,类似别名 

/***单循环链表:
与单链表不同的只有:最后一个结点的next指向头结点的地址 
***/

/***初始化: 
1、创建头结点,开辟空间,返回头结点的地址 
2、特别的:当链表中只有头结点一个的时候 头结点的next指向头结点的地址 L->next=L;
***/
Node* InitList(){
	Node* L=(Node*)malloc(sizeof(Node));
	L->data=0;
	L->next=L;
	return L;
}

/***增加结点-头插法:
作用:将数据插入的开头(头结点的后面)
实现:新结点的next指向头结点的next,头结点的next指向新结点的地址 (先赋值给新结点 再将头结点与下一个结点断开连接) 
***/
void headInsert(Node* L,int data){
	Node* node=(Node*)malloc(sizeof(Node));
	node->next=L->next;
	L->next=node;
	L->data++;
	node->data=data;
}

/***增加结点:尾插法:
作用:将新结点插入链表的最后一个
实现:将原来最后一个结点指向的头结点的地址 移动给 新结点(新结点的next是头结点) ,而原最后一个结点的next是新结点 
***/
void tailInsert(Node* L,int data){
	Node* node=(Node*)malloc(sizeof(Node));
	Node* P=L;
	while(P->next!=L){//得到尾结点的地址 
		P=P->next;
	}
	node->next=L;
	P->next=node;
	node->data=data;
	L->data++; 
}

/***删除结点:
作用:找到目标结点 删除它
实现:遍历链表->找到目标结点->将上一个结点的next指向被删除结点的next->释放删除结点的空间
如果没有找到目标结点返回0(假) 
***/
int deleteList(Node* L,int data)
{
	Node* l=L;//上一个结点 
	Node* p=L->next;//需要删除的结点 
	while(p!=L){
		if(p->data==data){
			l->next=p->next;
			free(p);
			L->data--;
			return 1;
		}
		l=p;
		p=p->next;
	}
	return 0;
}

/***打印链表:遍历 
***/
void printList(Node* L){
	Node* p=L->next;
	while(p!=L){
		printf("%d->",p->data);
		p=p->next;
	}
	printf("NULL\n");
}


int main(){
	Node* L=InitList();  //得到头结点的地址 
	headInsert(L,5);
	headInsert(L,4);
	headInsert(L,3);
	headInsert(L,2);
	headInsert(L,1);
	tailInsert(L,6);
	tailInsert(L,7);
	tailInsert(L,8);
	tailInsert(L,9);
	tailInsert(L,10);
	
	printList(L);
	
	deleteList(L,5);
	deleteList(L,10);
	deleteList(L,1);
	
	printList(L);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值