当前位置:首页 » 编程语言 » c语言链表申请新结点
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言链表申请新结点

发布时间: 2022-06-14 02:18:24

⑴ 求助:如何用c语言创建一个自定义链表类型的头结点

Linklist head=(Linklist)malloc(sizeof(ListNode));这句话要在函数里用(main等),因为在编译时不能确定head的值,这好像涉及编译原理的内容,应该有警告,但可以运行

⑵ C语言 创建带头结点的链表

单链表的生成有2种方式:头插法和尾插法。
1、头插法
/*********************************************************************
* 函数名称:linklist *CreateLinklistHead()
* 函数功能:利用头插法创建链表
* 参 数:无
* 返 回 值:创建完链表后的链表头结点
* 说 明:无
*********************************************************************/
extern linklist *CreateLinklistHead()
{
int x, i, nodeNum;
linklist *head, *temp; // 头结点与临时结点
head = (linklist *)malloc(sizeof(linklist)); // 生成表头结点
head->next = NULL; // 给表头结点的指针域赋值
printf("请输入链表中结点的个数:");
scanf("%d", &nodeNum);
for(i=1; i<=nodeNum; i++)
{
printf("请输入第 %d 个结点的数据:", i);
scanf("%d", &x);
temp = (linklist *)malloc(sizeof(linklist)); // 生成新的结点
temp->data = x; // 对新结点的数据域赋值
// 将新结点插到头结点之后
temp->next = head->next;
head->next = temp;
}
return head; // 返回新建链表的头结点
}2、尾插法
/*********************************************************************
* 函数名称:linklist *CreateLinklistRear()
* 函数功能:利用尾插法创建链表
* 参 数:无
* 返 回 值:创建完链表后的链表头结点
* 说 明:无
*********************************************************************/
extern linklist *CreateLinklistRear()
{
int x, i, nodeNum;
linklist *head, *rear, *temp; // 定义头结点、尾结点和临时结点
head = (linklist *)malloc(sizeof(linklist)); // 生成表头结点,表头结点不存放数据
head->next = NULL; // 将表头结点的指针域赋值为NULL
rear = head; // 将表头结点赋值给表尾结点
printf("请输入链表中结点的个数:");
scanf("%d", &nodeNum);
for(i=1; i<=nodeNum; i++)
{
printf("请输入第 %d 个结点的数据:", i);
scanf("%d", &x);
temp = (linklist *)malloc(sizeof(linklist)); // 生成新的结点
temp->data = x; // 新增结点的数据域
temp->next = NULL; // 新增结点的指针域(由于是尾插法,所以插入的结点都在尾部,即指针域为NULL)
rear->next = temp; // 使前一个结点指向新增结点(head->next=temp)
rear = temp; // 将新增结点赋值给尾结点(尾插法,插入的结点在尾部)(rear=head->next)
}
//rear->next = NULL; // 将尾结点的指针域赋值为空(为了方便检验链表是否为空链表)
return head; // 返回头结点
}

⑶ C语言单链表怎么插入节点

#include"sll_node.h"
#include<stdlib.h>

#defineFALSE0
#defineTRUE1

//insertNode2:把newValue的值插入到递增排序的链表中,正确返回TRUE,错误返回FALSE
//nextp是指向当前节点的指针,最初是头指针
intinsertNode2(Node**nextp,intnewValue)
{
Node*newNode;//新节点指针
Node*current;//当前节点指针

current=*nextp;//最初当前节点为nextp指针指向的节点
//查找新插入节点的位置
while(current!=NULL&&current->value<newValue)
{
nextp=¤t->next;
current=current->next;
}

//为新节点分配内存
newNode=(Node*)malloc(sizeof(Node));
if(newNode==NULL)
returnFALSE;
newNode->value=newValue;

//统一了插入的步骤。即:每次插入,都是前一个指针指向新节点,新节点指向下一个节点
*nextp=newNode;
newNode->next=current;

returnTRUE;
}

main函数
[cpp]viewplain
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"sll_node.h"

intinsertNode(Node**rootp,intnewValue);
intinsertNode2(Node**nextp,intnewValue);

intmain()
{
srand(time(0));

Node*head=(Node*)malloc(sizeof(Node));
head->next=NULL;

for(inti=0;i<5;i++)
{
inttemp=rand()%50;
printf("%d ",temp);
//insertNode(&head,temp);
insertNode2(&head,temp);
}

Node*p=head->next;
while(p!=NULL)
{
printf("%d ",p->value);
p=p->next;
}

getchar();
getchar();
return0;
}

⑷ c语言链表怎么通过节点数据查找节点进行插入或更改;

说一下一个大概的思路,首先定义两个指针,一个指针用来向前移动(叫当前指针),另一个指针紧跟其后(叫前驱指针),这个主要用于链表的增删,判断是否要删除当前指针指向的节点,或者增加节点。如果需要删除当前节点,则前驱指针的下一个节点指向当前指针的下一个节点,释放当前指针指向的节点,然后当前指针指向前驱指针的下一个节点,增加也是一样的,一直这样遍历整个链表。至于修改节点数据,那么需要一个当前指针就够了,找到要修改的节点,修改就好了。

闲着没事干,刚写了代码,给你参考一下:


//删除节点
voiddelete_node_credit(floatconstcredit){

stu*pre_node=head;
stu*cur_node=head->next;

while(cur_node){

if(cur_node->credit==credit){

pre_node->next=cur_node->next;
free(cur_node);
cur_node=pre_node->next;
}else{

pre_node=cur_node;
cur_node=cur_node->next;
}
}
//判断是否删除头节点
if(head->credit==credit){

cur_node=head->next;
free(head);
head=cur_node;
}
}
//新增节点
voidinsert_node_credit(stu*new_node,floatconstcredit){

stu*pre_node=head;
stu*cur_node=head->next;

if(pre_node->credit>credit){//新增节点是头节点

head=new_node;
new_node->next=pre_node;
return;
}
while(cur_node){

if(cur_node->credit<credit&&pre_node->credit>credit){

pre_node->next=new_node;//插入新的节点
new_node->next=cur_node;
return;
}
pre_node=cur_node;
cur_node=cur_node->next;
}
//新增节点插入链表尾部
if(pre_node->credit<credit){

pre_node->next=new_node;
return;
}
}

下面是运行结果

如果你看理解了这个思路,那么链表的增删查改操作就没有问题了。有用的话点一下采纳,谢谢!!!

⑸ C语言  动态链表新申请节点的指针域 是否默认指向NULL

何谓指针域?
struct
Node(
int
n;
Node*
next;
//指针域???
}
这里的next可以指向任何地址,随你怎么指都可以。(当然,默认建议设为NULL)如果不设的就是所谓的
野指针
,你不访问时没错,一旦访问野指针的话后果难以预料。

⑹ c语言链表多次插入新节点的问题

前面的都没什么问题,问题在insert函数中。首先当头指针为空的情况下也就是if(b==null)只要把插入的节点加上就是你下面的b=s3;s3->next=null;而后面的部分则不执行,改成下面这样:
if(b==null)
{ b=s3;s3->next=null;}
else
{

……
}
还有我不明白(s4->num!=s1->num)你这里判断这两个相等和s1->next!=null有什么用,你讲下你想做什么,好帮你改

⑺ c语言链表插入一个新节点的函数问题

首先,主函数中,“请输入插入的数据”那里scanf应该是&b,这是引发崩溃的原因。

其次,insert函数的目的应该是想插入数据后仍是有序链表。但你的insert函数逻辑太乱,有些不必要的判断,我修正了你的代码,贴给你看看。(虽然你insert是想保证有序,但你在创建的时候没有保证有序,所以最终结果不一定是有序。例如,创建 1,5,2,插入3,最后输出的是 1,3,5,2)

代码修改:

  1. scanf("%d", &b);

  2. 重写了insert函数,简化逻辑;

  3. 动态分配的内存记得释放,增加freeNode释放空间

#include<stdio.h>
#include<stdlib.h>
structlink
{
intdata;
structlink*next;
};
structlink*add(structlink*head);//创建链表
voiddisplay(structlink*head);//输出数据
structlink*insert(structlink*head,intb);//插入新节点
voidfreeNode(structlink*); //释放空间
intmain()
{
charc;
structlink*head=NULL;
printf("要创建一个链表吗?");
scanf("%c",&c);
while(c=='y'||c=='Y')
{
head=add(head);
printf("要继续创建节点吗?");
scanf("%c",&c);
}
display(head);
intb;
printf("输入插入的数据");
scanf("%d",&b);
head=insert(head,b);
display(head);
freeNode(head);
}
structlink*add(structlink*head)
{
intdata;
structlink*p=(structlink*)malloc(sizeof(structlink));
if(head==NULL)
{
head=p;
}
else
{
structlink*pr=head;//一个临时指针pr先保存下head的地址
while(pr->next!=NULL)
{
pr=pr->next;
}
pr->next=p;
}
printf("输入数据");
scanf("%d",&p->data);
p->next=NULL;
returnhead;
}
voiddisplay(structlink*head)
{
structlink*pr=head;
while(pr!=NULL)
{
printf("%d ",pr->data);
pr=pr->next;
}
}
structlink*insert(structlink*head,intb)
{
structlink*ptr=head,*prev=head;
structlink*newNode=(structlink*)malloc(sizeof(structlink));
newNode->data=b;
while(ptr&&b>ptr->data){
prev=ptr;
ptr=ptr->next;
}
newNode->next=ptr;
if(ptr==head) head=newNode;
else prev->next=newNode;

returnhead;
}

voidfreeNode(structlink*node){
if(!node) return;
freeNode(node->next);
free(node);
}

⑻ c语言编程的问题: 要见一个动态链表 然后任意插入一个结点 怎么做啊

单链表操作很简单的,
插入操作如下:
1.
创建一个新节点并分配空间
pt
2.
移动到要插入的节点
p1
3.
新节点->next=p1->next
将新节点指向当前的节点的下一个节点
4.
p1->next=pt
将当前节点指向新节点

⑼ C语言,关于单链表插入结点问题,求大虾解答

node=(linklist)malloc(sizeof(len);//创建一个新的结点node
node->next=temp->next;//给node的指针域赋值temp的指针域所储存的地址,赋值之后的结果相当于node指向temp的下一个结点
temp->next=node;//之后,temp的指针域存放node结点的地址,相当于temp指向node。
//这样就成功的在temp后插入node这个结点了。

⑽ 单链表怎样插入一个结点c语言

如果已知一个节点指针pre和一个节点指针cur,要把cur插入到pre节点之后,很显然要保证链表不会断开而丢失后面的节点,要先把后面的节点指针(指向lat的指针)保存下来,即有cur->next = pre->next,然后把cur连接的一串链表连接到pre后面,即pre->next = cur;

上面介绍了,在一个节点之后插入节点的情况。这是通常的情况。如果要向一个链表的头部插入节点,就只需要将新节点的下一个指针指向链表的头指针即可。

在这种情况下,有两点要注意:

1,链表是否为空链表

2,要插入的节点是不是空指针。

代码实现:

//向单链表中插入一个节点(插入在链开始处)
//输入参数:单链表的头指针和要插入的节点指针
//输出参数:无
//返回值:指向单链表的头指针
SingleList* Insert(SingleList *head,SingleList *node)
{
if(node == NULL)
{
return head;
}
else if(head == NULL)
{
return node;
}

node->next = head;
head = node;
return head;
}