【数据结构】单链表的基本操作

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。【数据结构】单链表的基本操作,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

以链式结构存储的线性表称为链表;
链式存储结构是用一组任意的存储单元来存储线性表的结点;

  • 在链式存储结构中,存储单元可以是相邻的,也可以是不相邻的
  • 相邻的存储单元中的数据不一定是相邻的结点

单链表的结点结构:结点之间的逻辑关系是由结点中的指针指示的(如图)
单链表的结点结构

单链表的优缺点

单链表(链式存储):每个结点除了存放数据元素外,还要存储指向下一个节点的指针

  • 优点:不要求大片连续空间,改变容量方便
  • 缺点:不可随机存取,要耗费一定空间存放指针

单链表的基本操作—头插法

头插法流程

代码部分

#include<stdio.h>
//定义结点
struct Node {
	int data; //数据域
	struct Node* next; //指针域
};

//初始化
struct Node * InitList() {
	struct Node *L = (struct Node*)malloc(sizeof(struct Node));
	L->next = NULL;
	printf("--->>>初始化成功\n");
	return L;
}

//输入数据
void InputList(struct Node *L) {
	while (1) {
		int data;
		struct Node* P = (struct Node*)malloc(sizeof(struct Node));
		printf("请输入数据(输入0结束):");
		scanf_s("%d",&data);
		if (data == 0) {
			printf("--->>>输入结束\n");
			break;
		}
		P->data = data;
		P->next = L->next;
		L->next = P;
	}

}

//输出数据
void PrintList(struct Node *L) {
	struct Node* P;
	int i = 0;
	P = L->next;
	printf("--->>>链表内数据有:");
	while (P) {
		printf(" %d ",P->data);
		P = P->next;
		i++;
	}
	printf("\n--->>>输出完毕,共有%d个数据\n",i);
}

//插入数据
void insertList(struct Node *L) {
	int i = 0,loc, data;
	struct Node* P;
	struct Node* S = (struct Node *)malloc(sizeof(struct Node));
	P = L;
	printf("--->>>请输入插入位置(从0开始):");
	scanf_s("%d",&loc);
	printf("--->>>请输入插入数据:");
	scanf_s("%d",&data);
	while (i<loc) {
		P = P->next;
		i++;
	}
	S->data = data;
	S->next = P->next;
	P->next = S;
	PrintList(L);
}

//删除数据
void DelList(struct Node * L) {
	int i = 0, loc;
	struct Node* P,*delNode;
	PrintList(L);
	printf("\n请输入要删除数据的位置(从1开始):");
	scanf_s("%d",&loc);
	
	if (loc == 1) {//删除头结点
		P = L->next;
		L->next = P->next;
		free(P);
	}else {//删除其他结点
		P = L;
		while (i<loc - 1) {
			P = P->next;
			i++;
		}
		delNode = P->next;
		P->next = delNode->next;
		free(delNode);
		printf("--->>>删除成功\n");
	}
	PrintList(L);
}

void main() {
	struct Node * L = InitList();
	InputList(L);
	PrintList(L);
	insertList(L);
	DelList(L);
}

运行结果如下:
初始化成功
输入
输出数据
插入数据
删除数据

补充:

单链表的基本操作—尾插法
与头插法恰好相反:每次输入数据从末尾插入

//尾插法输入数据
void InputNodeList(struct NodeList *L) {
	struct NodeList* P,*Q,*S;
	Q = (struct NodeList*)malloc(sizeof(struct NodeList));
	P = L;
	while (1) {
		int data;
		S = (struct NodeList*)malloc(sizeof(struct NodeList));
		printf("--->>>请输入数据(0结束):");
		scanf_s("%d", &data);
		while (P) {
			Q = P;
			P = P->next;
		}
		if (data == 0) {
			printf("\n--->>输入完成\n");
			break;
		}
		S->data = data;
		S->next = NULL;
		Q->next = S;
		P = S;
	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204377.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!