C语言 创建单链表2.0

C语言 实现单链表 增删改查 尾插法

// 带头结点单链表 
# include <stdio.h>
# include <stdlib.h>

// 定义结构体
typedef struct LNode {
	// 数据域
	int data; 
	// 指针域   指向一个节点   节点类型的指针(涉及地址划分) 
	struct LNode *next;
}Node, *NodeList; 

// 初始化单链表(带头结点)
bool InitList(NodeList &L){
	// 分配空间
	L = (Node *)malloc(sizeof(Node)); 
	// 判断是否正常获取空间
	if (L==NULL) {
		return false;
	} 
	// 正常分配则指针域置为空
	L->next = NULL;
	return true; 
} 

// 向链表添加10个元素 
void addNode(NodeList &L) {
	// 尾插法  新建尾指针 
	Node *end = L;
	for (int i=0;i<10;i++) {
		// 新申请空间   指针保存 
		Node *a = (Node *)malloc(sizeof(Node));
		//  数据域保存   指针用->   变量用. 
		a->data = i;
		// 指针域为空
		a->next = NULL;
		// 上一节点的指针为新节点
		end->next = a;
		// 新节点变为 
		end = a; 
	}
}

// 在链表的第k个位置插入元素e 
int InsertList(NodeList &L, int k, int e) {
	Node *head = L->next; 
	// 计算链表的长度 
	Node *len_head = L->next;
	// 长度变量 
	int i = 0; 
	while(len_head != NULL) {
		len_head = len_head->next;
		i++;
	}
	printf("\n链表长度:%d\n", i);
	if ((k<1)||(k>i+1)) {
		return 101;
	} else {
		// 插入元素
		// 分 第一位置 ,>1 位置 
		// 新建一个节点
		Node *aa = (Node *)malloc(sizeof(Node));
		// 数据域 
		aa->data = e;
		if (k==1) {
			aa->next = L->next;
			L->next = aa;
			return 202;
		}else {
			// 遍历到这个节点的上一节点 
			for (int j=0;j<k-2;j++) {
				head = head->next;
			} 
			// 指针域 
			aa->next = head->next;
			// 上一节点的 
			head->next = aa; 
			return 202;
		}
	}
} 

// 计算链表的长度 
int GetLength(NodeList &L) {
	Node *head = L->next;  // 头结点后的节点 
	int i = 0;
	// 遍历单链表 
	while (head != NULL) {
		head = head->next;
		i++;
	} 
	return i;
} 

// 删除链表元素
// 第k个位置的  e元素 
bool Deletelist(NodeList &L, int k, int &e) {
	// 判断k是否合法
	int Llength = 0;
	Llength = GetLength(L); 
	if ((k<1)||(k>Llength)) {
		return false;
	}
	Node *head = L->next;
	// 删除第一个元素 
	if (k==1) {
		Node *c = head;
		e = head->data;
		L->next = head->next;
		free(c);
		return true;
	} else {
		// 删除>1 
		for (int j=0;j<k-2;j++) {
			head = head->next;
		}
		// 中间指针
		Node *c = head->next;
		e = head->next->data;
		head->next = head->next->next;
		free(c); 
		return true;
	}
} 

// 查找元素 
int LookupList(NodeList &L, int e) {
	Node *head = L->next;
	int i = 0;
	bool tt = true;
	while((head->next!=NULL)&&(tt)) {
		int kkk = head->data;
		if (kkk==e){
			tt = false;
		}
		head = head->next;
		i++;
	}
	if (tt==true) {
		return -1;
	}
	return i;
}

// 更改第k个元素的值为e 
bool UpdateList(NodeList &L, int k, int e) {
	// 查看k值是否合法
	// 当前链表长度 
	int xx = GetLength(L); 
	if ((k<1)||(k>xx)) {
		return false; 
	} else {
		Node *head = L->next; 
		for (int j=0;j<k-1;j++) {
			head = head->next; 
		} 
		head->data = e;
		return true;
	}
} 

int main() {
	// 创建单链表  头指针  
	NodeList L; 
	// 初始化链表 (带头节点)
	InitList(L);
	// 向L插入10个元素
	addNode(L); 
	// 查看单链表的元素 利用头指针  所有节点的指针均为 Node类型 
	Node *cc = L->next;   // 头节点后开始保存元素
	for (int i=0;i<10;i++) {
		int L_data = cc->data;
		printf("%d - > ", L_data);
		// 遍历指针变为下一节点指针 
		cc = cc->next;
	}
	// 位置 元素 
//	if(InsertList(L, 13, 0)) {
//		printf("插入成功\n"); 
//	}else {
//		printf("插入失败\n");
//	} 
	int ddd = InsertList(L, 11, 88);
	if (ddd == 101) {
		printf("返回代码: %d: 插入位置溢出\n ", ddd);
	} else if (ddd == 202) {
		printf("返回代码: %d:插入成功\n", ddd);
	}
	Node *ccc = L->next;
	int g=0;
	while(ccc != NULL) {
		int kkk = ccc->data;
		ccc = ccc->next;
		g++;
	}
	printf("\n当前单链表长度: %d\n", g);
//	Node *eee = L->next->next;
//	int fff = eee->data;
//	printf("%d - > ", fff); 
	// 删除
	int e = -1;
	if (Deletelist(L, 5, e)) {
		printf("\n删除成功元素: %d\n", e);
	}else {
		printf("删除失败\n");
	}
	Node *qqq = L->next;
	int gg = 0;
	while(qqq != NULL) {
		int kkk = qqq->data;
		printf("%d - > ", kkk);
		qqq = qqq->next;
		gg++;
	}
	printf("\n链表长度: %d\n", gg);
	// 查找元素 k 在第e位置 
	int kkc = 5;
	printf("\n元素%d 在第 %d的位置\n", kkc,LookupList(L, kkc));
	// 修改元素 
	printf("\n修改第5个元素为999\n");
	UpdateList(L, 1, 999);
	Node *ppp = L->next;
	int uu = 0;
	while(ppp != NULL) {
		int yyy = ppp->data;
		printf("%d - > ", yyy);
		ppp = ppp->next;
		uu++;
	}
	printf("\n链表长度: %d\n", uu);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值