C语言数据结构之链表详细解析

单链表

1.单链表存储类型的描述

单链表由一个个的相互独立的结点构成,每个结点均为一个结构体,每个结构体都包含两个结构体成员,分别为数据域data和指针域next。数据域用于存放链表的数据,指针域用于存储其后继节点的地址。
单链表的节点的结构如下
单链表的节点的结构
单链表的节点的结构体(数据域+指针域)

typedef struct LNode {
Elemtype data;
Struct LNode *next;
}LNode,*Linklist

2.单链表的建立

单链表的建立分为两种方式——头插法和尾插法

1.头插法(新生成的节点插在头指针和头结点之间)
头插法图示(红色线表示新增的指针)
头插法图示1. 核心步骤

s->data=x;
s->next=L->next;
L->next=s;

2.程序演示

Linklist CreateList1(Linklist &L){
Linklist s;										//在结构体声明的时候时候已经将linklist声明为指针类型
int x;
L=(Linklist) malloc(sizeof(LNode));  //生成头结点
L->next=NULL;								//头结点的next域置为空  
Scanf(“%d”,&x);
While(x!=9999){				//输入9999停止生成节点
		S=(Linklist)malloc(sizeof(LNode));   //生成一个新的节点
		s->data=x;							//给新的节点的data域赋值,值为上述输入的x
		s->next=L->next;					//将新生成的节点的next域指向头结点
		L->next=s;							//头指针指向新生成的节点
		Scanf(“%d”,&x);					//循环条件
}
}

2.尾插法:(新生成的节点插在当前链表的最后一个节点之后)
头插法图示(红色线表示新增的指针)
尾插法图示
1.核心步骤(新声明一个指针R指向当前链表的最后一个节点)

s->data=x;		//将要插入的值放入新声明的节点中
r->next=s;		//将新的节点与链表的最后一个节点连接起来
r=s;			//让r指向新的链表的最后一个节点

2.程序演示:

Linklist CreateList2(Linklist &L){
	int x;
	Linklist s,r;			//s用于指向新生成的节点  r指向当前链表的最后一个节点
	r=L;
	L=(Linklist)malloc(sizeof(LNode));    //生成头结点
	Scanf(“%d”,&x);
	while(x!=9999){
		s=(Linklist)malloc(sizeof(LNode));		//生成新的节点
		s->data=x;
		r->next=s;
		r=s;
		scanf(“%d”,&x);
}
r->next=NULL;					//将链表的最后一个节点的next域置为空
return L;
}

3.单链表的查找

1.按值查找(在链表中确定某值是否存在,若存在确定位置)

Lnode *LocalElem(Linklist L,ElemType e){
	LNode *p;
	p=L->next;
	while(p!=NULL&&p->data!=e){
		p=p->next;
}
return p;			//返回所查到的值得指针
}

2.按序号查找(找到第x个节点)

 LNode * GetElem(Linklist L,int i){
	LNode *p;
	P=L->next;
	int j;
	if(i=0)		//判断要找的节点的位置,规定:0表示头结点
		return p;
	if(i<0)			//位置小于0不合法
		return NULL;
	while(j<i){
		p=p->next;
		j++;
}
return p;			//返回节点位置
}

4.单链表的插入、删除

1.插入节点
(1)插入图示
插入节点图示注:指针的变动顺序必须是1-2,顺序不能互换,若先连接2,则新节点及新节点以后的节点则没有指针能指向他们,即丢失了后边的所有节点。
(2)核心代码:

R=GetElem(L,i-1);		//找到插入位置
S->next=R->next;		//连接新节点S和后边的节点(即图中步骤1),此时R原有指针没变,可以找到后边的节点
R->next=s;				//R连接新节点S(即图中步骤2)

2.在……之前插入
1.例如在第四个节点之前插入节点等同于在第三个节点前插入,调整GetElem这个函数的参数即可。
2. 也可以在第四个节点以后插入新的节点再交换第四个节点和第五个节点的值。
核心代码:

//在……之后插入一个节点 
s->next=p->next;
p->next=s;
//交换两个元素的值
temp=p->data;
p->data=s->data;
s->data=temp;

2.删除节点
(1)删除图示
删除节点图示
(2)核心代码

S=GetElem(L,i-1);   //找到要删除的节点
e=S->data;		//通过e保存要删除的节点的data值
R->next=S->next;			//删除节点
free(S);				//释放删除的节点

5.双链表

双链表图示:
双链表图示
1.结构体:

typedef struct DNode{
ElemType data;
struct DNode *piror;
struct DNode *next;
}DNode,*DLinklist;

双链表的插入:(核心在于先解决没有指针指着的后边的那个节点)
例如:在第二个节点后插入一个新的节点
(1)插入图示
双链表插入节点指针的改变步骤为图中的1-2-3-4,其中:1,2的顺序可互换,3,4的顺序可互换
(2)核心代码

s->next=R->next;  //s表示新插入的节点,p表示第三个节点
R->next->piror=s;
R->next=s;
s->piror=R;

双链表的删除:
例如:删除第二个节点
(1)删除图示
双链表删除节点其中:指针的变动顺为1-2或者2-1
(2)核心代码

R->next=S->next;   //p表示第三个节点,q表示第四个节点,即要删除的节点
S->next->piror=R;
free(S);      //这一步释放节点一定不要忘了

循环链表:
单循环链表:尾节点的next域指向头结点
双循环链表:头结点的piror域指向尾节点,尾节点的next域指向头结点

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
数据结构是计算机科学中非常重要的一个概念,它关注如何有效地存储和组织数据以及对数据进行操作和管理。C语言是一种功能强大且广泛应用于系统和应用程序开发的编程语言,也是学习数据结构的常用语言之一。 在C语言中,常用的数据结构包括数组、链表、栈、队列、树等。下面我将简单介绍这些数据结构的基本概念和实现方式: 1. 数组(Array):是一种线性数据结构,可以在内存中连续存储多个元素。通过索引可以快速访问数组中的元素,但插入和删除操作较慢。 2. 链表(Linked List):是一种通过指针在内存中连接起来的数据结构链表的插入和删除操作比较快,但访问元素需要遍历链表。 3. 栈(Stack):是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。 4. 队列(Queue):是一种先进先出(FIFO)的数据结构,只能在队尾插入元素,在队头删除元素。 5. 树(Tree):是一种非线性的数据结构,由节点和边组成。常见的树结构包括二叉树、二叉搜索树和平衡二叉树等。 在C语言中,可以使用结构体来定义和表示数据结构。例如,可以定义一个链表节点的结构体: ``` struct ListNode { int val; // 节点的值 struct ListNode *next; // 指向下一个节点的指针 }; ``` 然后通过操作指针来进行链表的插入、删除和遍历等操作。 这只是数据结构的基础概念和C语言实现方式的简要介绍,实际上还有很多其他的数据结构和算法。如果你对某个具体的数据结构或算法有更深入的了解,我可以为你提供更详细的解答。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值