c语言链表删除某一个节点(单链表的删除算法c语言)

admin 404 0

老铁们,大家好,相信还有很多朋友对于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语言的问题到这里结束啦,希望可以解决您的问题哈!