C语言实现双链表

C语言 双链表 插入 翻转

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

typedef struct LNode{
	int data;
	struct LNode *prev;
	struct LNode *next;
}Node, *NodeList;

// 初始化 
bool InitList(NodeList &L) {
	// 头节点
	L = (Node *)malloc(sizeof(Node));
	if (L==NULL) {
		return false;
	} else {
		return true;
	}
}

// 判断空表
bool EmptyList(NodeList &L) {
	if (L->next==NULL) {
		return true; 
	}else {
		return false;
	}
} 

// 表长度
int Length(NodeList &L) {
	Node *head = L->next;
	int ll = 0;
	while(head!=NULL) {
		head=head->next;
		ll++;
	}
	return ll;
} 

// 在第k个位置插入元素e 
bool addList(NodeList &L, int k, int e) {
	// 判断k是否合法
	int ll = Length(L); 
	if ((k<1)||(k>ll+1)) {
		return false; 
	}else {
		// 新建空间
		Node *cc = (Node *)malloc(sizeof(Node));
		cc->data = e;
		// 空表插入元素 
		if (EmptyList(L)) {
			L->next = cc;
			cc->prev = NULL;
			cc->next = NULL;
			return true;
		}else {
			// 设置指针 遍历位置 
			Node *head = L; 
			if (k==1) {
				// 前指针
				cc->prev = NULL;
				// 后指针 
				cc->next = head->next;
				// 后节点前指针 
				head->next->prev = cc;
				// 前节点后指针 
				head->next = cc;
				return true;
			}else {
				for (int i=0;i<k-1;i++){
					head=head->next;
				}
				if (head->next==NULL) {
					// 前指针 
					cc->prev = head;
					// 后指针 
					cc->next = NULL;
					// 后节点前指针 
					// 前节点后指针 
					head->next = cc;
					return true;
				}else {
					// 新元素前指针
					cc->prev = head;
					// 后指针 
					cc->next = head->next;
					// 后节点前指针 
					head->next->prev = cc;
					// 前节点后指针
					head->next = cc;
					return true; 
				}
			}
		}
	}
}
 
// 打印双链表 
void outputList(NodeList &L) {
	// 判断空表 
	if (EmptyList(L)) {
		printf("\n此表是空表拒绝打印\n"); 
	} else {
		Node *head = L->next;
		while(head!=NULL) {
			int kk = head->data;
			printf("%d -> ", kk);
			head = head->next;
		}
	}
} 

// 反向遍历链表 验证链表前后指针是否正确
void ergList(NodeList &L) {
	// 找尾结点
	Node *end = L->next;
	Node *kk = NULL;
	while (end!=NULL) {
		kk = end;
		end = end->next;
	} 
	printf("尾数据: %d\n", kk->data);
	// 反向遍历链表验证插入 
	while((kk!=NULL)) {
		int ddd = kk->data;
		printf("%d -> ", ddd);
		kk = kk->prev;
	}
}
 

int main() {
	// 初始化
	NodeList L;
	InitList(L);
	// 判断空表
	if(EmptyList(L)) {
		printf("这是一个空表\n"); 
	}
	int ll = Length(L);
	printf("表长度为:%d", ll); 
	outputList(L);
	
	// 写入一个元素 
	printf("第1个位置插入999元素");
	if (addList(L, 1, 999)) {
		printf("插入成功\n"); 
	}else{
		printf("插入失败\n");
	}
	outputList(L);
	
	// 写入一个元素 
	printf("第1个位置插入888元素");
	if (addList(L, 1, 888)) {
		printf("插入成功\n"); 
	}else{
		printf("插入失败\n");
	}
	outputList(L);
	
	
	// 写入一个元素 
	printf("\n第3个位置插入777元素");
	if (addList(L, 3, 777)) {
		printf("插入成功\n"); 
	}else{
		printf("插入失败\n");
	}
	outputList(L);
	
	// 写入一个元素 
	printf("\n第1个位置插入333元素");
	if (addList(L, 1, 333)) {
		printf("插入成功\n"); 
	}else{
		printf("插入失败\n");
	}
	outputList(L);
	// 验证 
	printf("\n翻转验证: \n");
	ergList(L); 
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值