C语言单链表 增 删 改 查

       链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

       作为有强大功能的链表,对他的操作当然有许多,比如:链表的修改,删除,插入,查询等等。

1.链表的创建

  

typedef struct Node
{
	int data;     //数据域
	struct LNode * next; //指向下一个节点的指针
}LinkList;

2.链表的初始化

void InitList(LinkList *&L)
{
	L = (LinkList *)malloc(sizeof(LinkList));
	L->next = NULL;
}

3.链表的插入

这里介绍的是头插法
 

void ListInsert(LinkList *&L, LinkList *p)
{
	LinkList *q;
	q = L;
	p->next = q->next;
	q->next=p;
}

将节点p插入到链表L中,只需要让p指向头结点指向的位置,在另头结点指向p,就可以吧p插入到链表中。

4.链表中某个节点的删除

void Delete(LinkList *&L, int e)
{
	LinkList *p = L->next;
	LinkList *q;//q用来记录上一个节点
	while (p->next != NULL)
	{
		if (p->data == e)//如果成立,则让上一个节点指向下一个节点,跳过该节点,即达到删除的目的
		{
			q->next = p->next;
		}
		q = p;
		p = p->next;
	}
	free(p);//删除后一定要记得释放空间,不然造成内存崩溃
}

用图来表示,即就是跳过该节点,直接指向下一个节点,再释放掉该节点。

 

5.遍历链表

	LinkList *q = L->next;
	while (q != NULL)
	{
		printf("%d ", q->data);
	}

这样就可对链表进行遍历,输出所有节点的数据域的值。

完整代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
	int data;     //数据域
	struct LNode * next; //指向下一个节点的指针
}LinkList;
void InitList(LinkList *&L)
{
	L = (LinkList *)malloc(sizeof(LinkList));
	L->next = NULL;
}
void ListInsert(LinkList *&L, LinkList *p)
{
	LinkList *q;
	q = L;
	p->next = q->next;
	q->next = p;
}
void Delete(LinkList *&L, int e)
{
	LinkList *p = L->next;
	LinkList *q=L;//q用来记录上一个节点
	if (p == NULL)
	{
		printf("目前无节点\n");
		exit(0);
	}
	while (p != NULL)
	{
		if (p->data == e)//如果成立,则让上一个节点指向下一个节点,跳过该节点,即达到删除的目的
		{
			q->next = p->next;	
			printf("删除成功\n");
			free(p);//删除后一定要记得释放空间,不然造成内存崩溃
			break;
		}
		q = p;
		p = p->next;
	}

}
void ADD(LinkList *&L)//增加
{
	int a, num;
	printf("请输入你要增加的数据:\n");
	scanf("%d", &num);
	LinkList *p = (LinkList *)malloc(sizeof(LinkList));
	p->data = num;
	ListInsert(L, p);
}
void dele(LinkList *&L)//删除
{
	int n;
	printf("请输入你要删除的数据:\n");
	scanf("%d", &n);
	Delete(L, n);
}
void change(LinkList *&L)//修改
{
	int i,j;
	printf("请输入你要修改的节点数据:\n");
	scanf("%d", &i);
	LinkList *q = L->next;
	while (q != NULL)
	{
		if (q->data == i)
		{
			printf("请输入你要修改后的数据:\n");
			scanf("%d", &j);
			q->data = j;
			printf("修改成功\n");
		}
		q = q->next;
	}
}
void Prin(LinkList *&L)//打印链表
{
	LinkList *q = L->next;
	while (q != NULL)
	{
		printf("%d ", q->data);
		q = q->next;
	}
	printf("\n");
}
int main()
{
	LinkList *L;
	InitList(L);
	int a;
	
	while (1)
	{
		printf("请输入你要进行的操作:\n1.增加数据\n2.删除数据\n3.修改数据\n4.打印链表\n");
		scanf("%d", &a);
		switch (a)
		{
		case 1:ADD(L); break;
		case 2:dele(L); break;
		case 3:change(L); break;
		case 4:Prin(L); break;
		default:printf("输入不合法\n");
		}

	}
	system("pause");
	return 0;
}

 

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是 C 语言链表代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 struct Node { int data; struct Node* next; }; // 定义链表头节点指针 struct Node* head = NULL; // 插入节点函数 void insertNode(int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; if (head == NULL) { head = newNode; } else { struct Node* temp = head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } printf("插入节点成功!\n"); } // 除节点函数 void deleteNode(int data) { if (head == NULL) { printf("链表为空,无法除!\n"); return; } struct Node* temp = head; if (temp->data == data) { head = head->next; free(temp); printf("除节点成功!\n"); return; } while (temp->next != NULL && temp->next->data != data) { temp = temp->next; } if (temp->next == NULL) { printf("未找到要除的节点!\n"); return; } struct Node* deleteNode = temp->next; temp->next = deleteNode->next; free(deleteNode); printf("除节点成功!\n"); } // 修节点函数 void modifyNode(int data, int newData) { if (head == NULL) { printf("链表为空,无法修!\n"); return; } struct Node* temp = head; while (temp != NULL && temp->data != data) { temp = temp->next; } if (temp == NULL) { printf("未找到要修的节点!\n"); return; } temp->data = newData; printf("修节点成功!\n"); } // 找节点函数 void searchNode(int data) { if (head == NULL) { printf("链表为空,无法找!\n"); return; } struct Node* temp = head; while (temp != NULL && temp->data != data) { temp = temp->next; } if (temp == NULL) { printf("未找到要找的节点!\n"); return; } printf("找到要找的节点,数据为:%d\n", temp->data); } // 打印链表函数 void printList() { if (head == NULL) { printf("链表为空,无法打印!\n"); return; } struct Node* temp = head; printf("链表中的节点数据为:"); while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("\n"); } int main() { insertNode(1); insertNode(2); insertNode(3); printList(); modifyNode(2, 4); printList(); searchNode(3); deleteNode(2); printList(); return 0; } ``` 以上是链表的基本操作函数,包括插入节点、除节点、修节点、找节点以及打印链表等功能。你可以根据需要进行修和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值