老铁们,大家好,相信还有很多朋友对于c语言链表删除某一个节点和单链表的删除算法c语言的相关问题不太懂,没关系,今天就由我来为大家分享分享c语言链表删除某一个节点以及单链表的删除算法c语言的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
一、c语言实现线性链表中删除一个大于某数的元素
1、node_type*creat_list()//创建链表函数/*更改:creat_list()前加上node_type**/
2、new_node=(struct node_type*)malloc(sizeof(struct node_type));/*更改:malloc(sizeof(struct node_type))前加上(struct node_type*)*/
3、printf("输入数值表:(输入负值时结束,负值不予输入)\n");/*添加:printf*/
4、{ new_node->next=NULL;//末尾指针初始化
5、{ new_node->next=NULL;//末尾指针初始化
6、new_node=(struct node_type*)malloc(sizeof(struct node_type));/*更改:malloc(sizeof(struct node_type))前加上(struct node_type*)*/
7、void print_list(node_type*head)//链表输出函数/*更改:print_list(node_type*head)前加void*/
8、void del_node(node_type*head)//删除链表中大于X的数据/*更改:del_node(node_type*head)前加void*/
9、printf("请输入要删除的数据最小值(删除数值大于该值的节点):");/*更改:输出内容*/
二、c语言 链表操作:建立,显示及节点的插入,删除
先写个头文件,包含链表的各种操作。具体代码如下:
typedef LNode*LinkList;//另一种定义LinkList的方法
//单链表线性表的基本操作(12个)
//操作结果:构造一个空的线性表L
L=(LinkList)malloc(sizeof(LNode));//产生头结点,并使L指向此头结点
void CreateList_L(LinkList&L, int n)//算法2.11
//逆位序输入(随机产生)n个元素的值,建立带表头结点的单链线性表L
L=(LinkList)malloc(sizeof(LNode));
L->next= NULL;//先建立一个带头结点的单链表
p=(LinkList)malloc(sizeof(LNode));//生成新结点
p->data= rand()%200;//改为一个随机生成的数字(200以内)
//初始条件:线性表L已存在。操作结果:销毁线性表L
int ClearList(LinkList L)//不改变L
//初始条件:线性表L已存在。操作结果:将L重置为空表
p=L->next;// p指向第一个结点
L->next=NULL;//头结点指针域为空
//初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
//初始条件:线性表L已存在。操作结果:返回L中数据元素个数
LinkList p=L->next;// p指向第一个结点
int GetElem(LinkList L,int i,ElemType&e)//算法2.8
// L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回1,否则返回-1
LinkList p=L->next;// p指向第一个结点
while(p&&j<i)//顺指针向后查找,直到p指向第i个元素或p为空
if(!p||j>i)//第i个元素不存在
int LocateElem(LinkList L,ElemType e,int(*compare)(ElemType,ElemType))
//初始条件:线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
//操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
//若这样的数据元素不存在,则返回值为0
if(compare(p->data,e))//找到这样的数据元素
int PriorElem(LinkList L,ElemType cur_e,ElemType&pre_e)
//操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
//返回1;否则操作失败,pre_e无定义,返回-1
LinkList q,p=L->next;// p指向第一个结点
while(p->next)// p所指结点有后继
int NextElem(LinkList L,ElemType cur_e,ElemType&next_e)
//操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
//返回1;否则操作失败,next_e无定义,返回-1
LinkList p=L->next;// p指向第一个结点
while(p->next)// p所指结点有后继
int ListInsert(LinkList L,int i,ElemType e)//算法2.9。不改变L
//在带头结点的单链线性表L中第i个位置之前插入元素e
while(p&&j<i-1)//寻找第i-1个结点
if(!p||j>i-1)// i小于1或者大于表长
s=(LinkList)malloc(sizeof(LNode));//生成新结点
int ListDelete(LinkList L,int i,ElemType&e)//算法2.10。不改变L
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
while(p->next&&j<i-1)//寻找第i个结点,并令p指向其前趋
if(!p->next||j>i-1)//删除位置不合理
q=p->next;//删除并释放结点
int ListTraverse(LinkList L,void(*vi)(ElemType))
// vi的形参类型为ElemType,与bo2-1.cpp中相应函数的形参类型ElemType&不同
//操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
LinkList ReverseList(LinkList phead)//实现链表的逆置
#endif// LINKEDLIST_H_INCLUDED
int compare(ElemType c1,ElemType c2)
void MergeList_L(LinkList&La, LinkList&Lb, LinkList&Lc)
//已知单链线性表La和Lb的元素按值非递减排列。
//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
Lc= pc= La;//用La的头结点作为Lc的头结点
if(pa->data<= pb->data)
pc->next= pa? pa: pb;//插入剩余段
printf("在L的表尾依次插入10个数据后:L=");
printf("第4个元素的值为:%d\n",e);
ListDelete(L,4,e);//删除第4个数据
printf("删除第4个数据后:L=");
三、c语言链表问题求解~当对表里最后一个结点删除的时候会出错
1、 while(p->next->data==e)
2、你的链表是有头结点的链表,假设表中只有头结点和一个节点X,这个节点等于e,现在来一步步分析:
3、首先,没进入循环之前,p->next就是那个节点X,不等于NULL,到循环内层
4、由于X节点等于e,所以 while(p->next->data==e)成立,进入内层循环
5、在内层循环中把p->next删除,然后p->next就会等于NULL
6、然后跳出内层循环,执行 p=p->next;,之后p=NULL
7、这时再回去判断p->next!=NULL,就会引起内存错误~!
四、数据结构(C语言版)中的删除链表中的一个节点
void newList(list* l)//创建结点
a[i]=(list*)malloc(sizeof(list));
void printfList(list* l)//打印结点的数据内容
printf("该链表的内容是:\n");
printf("%d\t", l->next->a);
void setList(list* l,int x,int y)
if(l->a>=y|| l->a<=x)//将结点的数据区与指定区域进行比较
head->next= l;//将满足条件的结点连接在新表的最后一个结点
list* l=(list*)malloc(sizeof(List));
printfList(l);//输出修改后的链表
1、插入、删除数据效率高,时间复杂度为O(1)级别(只需更改指针指向即可),随机访问效率低,时间复杂度O(n)级别(需要从链头至链尾进行遍历)。
2、和数组相比,内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针。
1)每个节点只包含一个指针,即后继指针。
2)单链表有两个特殊的节点,即首节点和尾节点。用首节点地址表示整条链表,尾节点的后继指针指向空地址null。
3)性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。
1)除了尾节点的后继指针指向首节点的地址外均与单链表一致。
2)适用于存储有循环特点的数据,比如约瑟夫问题。
1)节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)。
2)首节点的前驱指针prev和尾节点的后继指针均指向空地址。
五、C语言中链表怎么删除结点
1、删除节点很简单,以单链表为例,牢记三点
2、避免断链,删除掉节点后,前一个节点的p->next一定要指向后一个节点(如果是头节点,记得要将新表头P指向到原来的第二个节点。如果是尾节点,记得要将新的尾节点p->next置为NULL,)。
3、避免野指针,删除掉节点后,p->next=NULL;
4、避免内存泄漏,删除的节点,要用free释放堆内存。
5、如果是双向链表,不过是多了一个对prev操作,道理是一样的。
好了,关于c语言链表删除某一个节点和单链表的删除算法c语言的问题到这里结束啦,希望可以解决您的问题哈!