本文目录一览:
C语言链表原理
每个节点有一个数据域num保存该节点的数据,以及一个next域指向下一个节点的地址。假设某时刻指针p指向链表头结点,通过一个循环不停地将p赋值为p指向的节点的next域的值,即该节点的下一个节点的地址,即可遍历整个列表。
C语言链表的思路
链表的一种数据格式:
typedef int DataType;
typedef struct LinkNode
{
DataType data;
struct LinkNode *next;
} LinkNode;
可以用一个
LinkNode * h;
来代表一个链表。所以这种情况下,链表没有任何数据就没有节点、且h 等于 NULL;
创建链表、为链表增加节点有4步:
申请新节点的堆内存
修改新节点的next 为NULL
读取数据写入到该内存的数据区间(从外部文件、网络、标准输入、内存拷贝...)
将新节点添加到链表尾部
创建链表代码实现如下:
LinkNode* Create_LinkList()
{
LinkNode *h = NULL; // 指向链表第一个数据节点
LinkNode *tail = NULL; // 指向链表最后一个节点
while ( 1 )
{
// 用户不断的输入数据,直到输入负数
int input ;
scanf("%d", input);
if ( input 0 ) {
break;
}
// 申请新节点内存
LinkNode *newNode = (LinkNode *)malloc(sizeof(LinkNode));
// 设置新节点的next
newNode-next = NULL;
// 填充数据
newNode-data = input;
// 添加到链表尾
if ( h == NULL ) {
// 若表头为NULL,说明新节点为第一个节点,则表头和表尾都为新节点
h = tail = newNode;
} else {
// 否则将tail-next指向新节点,并更新表尾
tail-next = newNode;
tail = newNode;
}
}
// 返回链表第一个节点的指针
return h;
}
C语言中的链表怎么理解
链表是相同类型的若干个结构体用其自身携带的指针按照一定顺序串联成的一个链。
举个简单例子进行类比:
struct node{
int a;
struct node *next;
};
把这个链表节点的结构体struct node看作是人,结构体内的next指针看作是人的一只手,这只手只能用于指向人(别人或自己)。
如果有多个人排成一排,每个人都举起右手指向右边的人,就形成一个人组成的链表。
请教C语言链表 求详细分析错误原因 感谢
1 delete函数没有考虑如果head指向的节点就是要删除的节点的情况。如果删除的节点是dead,调用delete函数之后,后续所有操作都是错误的。因为把第一个节点删除之后应该让head指向下一个。
在遍历单向链表的时候,通常有两个指针,一个是当前节点(current_node),一个是前一个节点(previous_node)。当遍历开始时,他们应该都初始化为head。遍历期间让current_node = previous_node-next;
当我们删除的时候要判断要删除的节点是不是head,如果是删除完成后要重新给head赋值。代码:
Q* deletenode(Q* head, int data)
{
Q* current_node = head, *previous_node = head;
while(current_node != NULL)
{
if (current_node-score == data)
{
if (head == current_node) head = current_node-next;
previous_node-next = current_node-next;
free(current_node);
current_node = previous_node-next ;
continue;
}
previous_node = current_node;
current_node = current_node-next;
}
return head;
}
2 node函数没有问题,但是list函数感觉有问题,要创建n个节点,直接一个for循环就可以,没有必要判断是不是1个节点。list只要返回一个head指针就好,如果传进如的node节点数为0,直接返回NULL即可。