c语言链表代码求大神解释

问题描述

c语言链表代码求大神解释

insert中的 while( next_node && new_node->data > next_node->data) 是什么意思?
还有excise是什么意思,干什么用的?
最近在学链表,学不清楚...
#include
#include

#include "list.h"

/*
Create a new node containing the specified data,
and return a pointer to this newly-created node.
*/
Lnode * makeNode( int data )
{
Lnode *new_node =(Lnode *)malloc( sizeof( Lnode ));
if( new_node == NULL ) {
fprintf(stderr,"Error: memory allocation failed.n");
exit( 1 );
}
new_node->data = data;
new_node->next = NULL;
return( new_node );
}

/*
Search through list to find the first node with the
specified data, and return a pointer to this node.
If no such node exists, return NULL.
*/
Lnode * findNode( int data, Lnode *head )
{
Lnode *node = head; // start at first node in list

// keep searching until data found, or end of list
while(( node != NULL )&&( node->data != data )) {
node = node->next;
}
return( node );
}

/*
Push new node to front of list and
return the resulting (longer) list
*/
Lnode * push( Lnode *new_node, Lnode *head )
{
new_node->next = head;
return( new_node );
}

/*
Pop first item from list and
return the remaining (shorter) list
*/
Lnode * pop( Lnode *head )
{
Lnode *tmp;

if( head != NULL ) {
    tmp  = head;
    head = head->next;
    free( tmp );
}
return( head );

}

/*
Print all items in the list one by one
*/
void printList( Lnode *head )
{
Lnode *node = head;

// traverse the list printing each node in turn
while( node != NULL ) {
printf( "->%c", node->data );
node = node->next;
}
printf( "n" );
}

/*
Delete all the items from a linked list.
*/
void freeList( Lnode *head )
{
Lnode *node = head;
Lnode *tmp;

while( node != NULL ) {
tmp = node;
node = node->next;
free( tmp );
}
}

Lnode * insert( Lnode *new_node, Lnode *head )
{
Lnode *next_node = head, *prev_node = NULL;
while( next_node && new_node->data > next_node->data) {
prev_node = next_node;
next_node = next_node->next; // find correct position
}
if( prev_node == NULL )
head = new_node;
else {
prev_node->next = new_node; // link new node into list
}
new_node->next = next_node;
return( head );
}

Lnode * excise( Lnode *node, Lnode *head )
{
if( node != NULL ) {
if( node == head )
head = head->next; // remove first item
else {
Lnode *prev_node = head;
while( prev_node && prev_node->next != node ) {
prev_node = prev_node->next;
}
if( prev_node != NULL ) { // node found in list
prev_node->next = node->next;
}
}
}
return( head );
}

解决方案

while( next_node && new_node->data > next_node->data)
当下个节点存在,且新节点的数据大于下个节点的数据时进行循环
excise看逻辑是从head中删除node的,然后返回删除后的链表

解决方案二:

其实这些代码的英文意思就代表了中文执行的含义,

新节点存在,且数据大于下一个节点的数值

删除头结点并返回 搜索通过列表找到第一个节点

指定的数据,并返回一个指向该节点的指针。

如果不存在这样的节点,返回空。 excise就是删除切去的意思

解决方案三:

链表无非就是增删查改,想不清楚的地方自己画一画过程,这样更容易理解

解决方案四:

学习建议先从简单的入手,搞清楚以后再整些复杂的,或者找个带注释的

时间: 2024-12-04 00:22:57

c语言链表代码求大神解释的相关文章

链表-一段输出两个list不同之处的代码,求大神解释

问题描述 一段输出两个list不同之处的代码,求大神解释 为什么代码中既有head,也有tail,他们两个是什么关系,各起到什么作用?求大神解释 Lnode * difference( Lnode *list1, Lnode *list2 ) { Lnode *head = NULL; Lnode *tail = NULL; Lnode *new_node; Lnode *copy_node; // walk through both lists, adding nodes as necessa

c语言二叉树问题,代码不太理解,求大神解释,急

问题描述 c语言二叉树问题,代码不太理解,求大神解释,急 问题:A Binary Tree is called balanced if, for each node in the tree, the height of its left and right subtrees differ by no more than one. Write a function int height_if_balanced( Tnode *root ) which returns -1 if the tree

编程语言-我要用C++实现这段代码 求大神帮解释下R语言代码的意思

问题描述 我要用C++实现这段代码 求大神帮解释下R语言代码的意思 OrgData=read.csv("DownlinkPower_train.csv",header=T) TestData=read.csv("DownlinkPower_test.csv",header=T) #remove abnormal data, optional //移除异常数据 OrgData = subset(OrgData, OrgData[,1] > 0) TestData

c语言代码问题,有疑问,求大神解释

问题描述 c语言代码问题,有疑问,求大神解释 这个function的机理是什么? 为什么第二个循环只有分号...有什么作用 求大神解释 char *mystery( char *a, char *b ) { char *c = a; while ( *c != '' ) { c++; } while (( *c++ = *b++ ) != '' ) ; return a; } 解决方案 第一个循环,c指向了a字符串的末尾: 第二个循环,把b指向的字符串拷贝到a字符串后面了. 解决方案二: 求大神

c语言-求大神解释C语言题,请解释详细一点,谢谢

问题描述 求大神解释C语言题,请解释详细一点,谢谢 下面的代码输出什么? #include int main(void) { int i; int a[5]; for (i = 0; i <= 5; ++i) { a[i] = -i; printf("a[%d] = %dn", i, a[i]); } return 0; } 解决方案 #include<stdio.h> void main() { int i=0; int a[5]={0,0,0,0,0}; for

求大神解释下c语言双重for循环的汇编语句??

问题描述 求大神解释下c语言双重for循环的汇编语句?? void main(){ int i,j; for(i=0;i<5;i++){ printf("0"); for(j=0;j<2;j++){ printf("1"); } } } 汇编: main: .LFB24: pushl %ebp movl %esp, %ebp pushl %ebx andl $-16, %esp subl $16, %esp movl $5, %ebx .L3: movl

阶乘 算法-网上找的c语言的求大数阶乘的答案 看不太懂这个算法 求大神解释算法

问题描述 网上找的c语言的求大数阶乘的答案 看不太懂这个算法 求大神解释算法 #include int main() { ??? int n; ??? int a[9000]; //确保保存最终运算结果的数组足够大 ???? int digit = 1; //位数 ???? int temp;?? //阶乘的任一元素与临时结果的某位的乘积结果 ???? int i, j, carry; //carry:进位 ???? printf("please in put n:n"); ??? s

c-C语言 代码 求大神看看 困惑几天了 怎么修改 救命 啊救命

问题描述 C语言 代码 求大神看看 困惑几天了 怎么修改 救命 啊救命 C代码 int calc_imei(char inp_imei[16], char out_imei[12]) { char out_mask[12] = {0xAB, 0xA0, 0x6F, 0x2F, 0x1F, 0x1E, 0x9A, 0x45, 0x0, 0x0, 0x0, 0x0}; int i=0, j=0; for (i=0, j=0; i < 15; i++, j++) { if (inp_imei[i] <

c#解释代码-C# 求大神解释下面代码

问题描述 C# 求大神解释下面代码 public static string GetSerialPort() { return MulGetHardwareInfo(HardwareEnum.Win32_SerialPort, "Name"); } //枚举win32 api public enum HardwareEnum { Win32_SerialPort , Win32_SerialPortConfiguration , Win32_SerialPortSetting } pu