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

c语言单链表修改节点

发布时间: 2023-03-24 10:32:48

1. 求教c语言大神 如何交换单向链表的节点

交换链表结点,实质通常是交换结点结构体中除next指针以外的内容。传统、正宗和时效较高的方法是交换结点的关系指针而不交换其他成员。一个结点有自己的指针和指向下一个结点的指针,“自己的指针”就是上一结点的next指针,所以要交换上一结点的next指针和本级的next指针两个指针;而且由于头结点、尾结点的关系指针与中间结点的有所不同,所以遇到与头结点和尾结点交换时处理上与中间结点略有差异。所以操作起来比较麻烦,关系处理不好就会出错。另一个办法是对应交换除next指针以链慎茄外的所有成员,思路很清晰,就是代码较长,在结点成员较多时更为明显,书写就比较烦琐。有一个既保证思路清晰又书写方便的办法是“整体交换需要交换的两个结点,再把next指孝颤针交换回来”。我时常用这种办法。但别看代码读起来顺顺当当,也短浅,可别指望这能提高时效——因为交换结构体变量时,尽管书写很简短,其实还是一个成员对一个成棚察员地进行交换的,何况还多了个“把next指针交换回来”的操作。属个人体会,供参考。

2. C语言单链表节点

单链表的头插入:
L是头结点,
p是插入结点,
假设:
链表结构为
L->A->B...
L->next=NULL; // 这条语吵野句有问题, 头结点插入是不需要这句的, 否则.p->next=L->next就都等于null了;
p->next=L->next; //p的下个结点指向头结点L的下个结点A, 即:p的下个结点指向原第2个结点A
L->next=p; // 头结点L的下个结点指向p, 即将p插入到L的后面
// 最终结果为:L->P->A->B...---------------------------------------
单链表的尾插入:L是尾结点,p是插入结点,r为标记末尾结点
假设:
链表结构为
..A->B->L
L->next=NULL;//末尾结点没有下个结点, 即next指向null
r=L; // r标记末尾结漏宴点
p->next=NULL; // p待插入的末尾结点, 同样没有下升搜喊个结点, next指向null
r->next=p; // 将末尾结点r的下个结点指向p, 即:L下个结点指向p
r=p; // 将r重新指向新的末尾结点p
//最终结果:A->B->L->P

3. C语言中链表怎么删除结点

有分才有动力啊哥们。

删除节点很简单,以单链表为例,牢记三点

  1. 避免断链,删除掉节点后,前一个节点的p->next一定要指向后一个节点(如果是头节点,记得要将新表头P指向到原来的第二个节点。如果是尾节点,记得要将新的尾节点p->next置为NULL,)。

  2. 避免野指针,删除掉节点后,p->next=NULL;

  3. 避免内存泄漏,删除的节点,要用free释放堆内存。

如果是双向链表,不过是多了一个对prev操作,道理是一样的。

4. 如何用C语言创建一个链表,实现增、删、改、查

#includex0dx0a#includex0dx0a#include x0dx0a//先定义一种student类型,表示一个学生的信息,如下:x0dx0atypedef struct studentx0dx0a{x0dx0aint num; //表示学号x0dx0achar name[30]; //表示姓名x0dx0afloat score; //表示分数x0dx0a}student;x0dx0a//定义一种NODE类型,表示一个结点信息,如下:x0dx0atypedef struct nodex0dx0a{x0dx0astudent st; //表示一个学生的信息x0dx0astruct node *next; //表示一个NODE类型的指针x0dx0a}NODE;x0dx0a//1、写出建立一个带头结点的线性链表的函数,其中每个结点包括学号、姓名、分数三个数据域。函数形式如下:x0dx0aNODE *creat_link(int direction)x0dx0a{x0dx0aNODE *head,*p,*tail;x0dx0aint xh,i=1;x0dx0aif(direction==1) //当direction的值为1时,新建立的结点连到尾部x0dx0a{x0dx0atail=head=(NODE *)malloc(sizeof(NODE));x0dx0ahead->next=NULL;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0awhile(xh>0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕x0dx0a{x0dx0ap=(NODE *)malloc(sizeof(NODE));x0dx0ap->st.num=xh;x0dx0aprintf("请输入第%d个学生的姓名:",i);x0dx0ascanf("%s",p->st.name);x0dx0aprintf("请输入第%d个学生的成绩:",i);x0dx0ascanf("%f",&p->st.score);x0dx0ap->next=NULL;x0dx0atail->next=p;x0dx0atail=p;x0dx0ai=i+1;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0a}x0dx0a}x0dx0aelse if(direction==0) //当direction为0时,新建立的结点成为第一个结点x0dx0a{x0dx0ahead=(NODE *)malloc(sizeof(NODE));x0dx0ahead->next=NULL;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0awhile(xh>0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕x0dx0a{x0dx0ap=(NODE *)malloc(sizeof(NODE));x0dx0ap->st.num=xh;x0dx0aprintf("请输入第%d个学生的姓名:",i);x0dx0ascanf("%s",p->st.name);x0dx0aprintf("请输入第%d个学生的成绩:",i);x0dx0ascanf("%f",&p->st.score);x0dx0ap->next=head->next;x0dx0ahead->next=p;x0dx0ai=i+1;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0a}x0dx0a}x0dx0areturn head;x0dx0a}x0dx0a//2、写出输出上述链表各结点数据域值的函数。该函数对应的函数需要一个形参,表示链表的头指针,形式如下:x0dx0avoid print_link(NODE *head)x0dx0a{x0dx0aNODE *p;x0dx0ap=head->next;x0dx0aprintf("%-10s%-20s%-10s\n","学号","姓名","分数");x0dx0awhile(p!=NULL)x0dx0a{x0dx0aprintf("%-10d%-20s%-10.1f\n",p->st.num,p->st.name,p->st.score);x0dx0ap=p->next;x0dx0a}x0dx0a//该函数能输出head所指的链表的所有结点值,输出形式如下:x0dx0a/*本函数输出线性表sq中所有数据,形式如下:x0dx0a学号 姓名 分数x0dx0a12 张三 234.5x0dx0a18 李四 987.7x0dx0a??? ??? ??.*/x0dx0a}x0dx0a//3、写出在链表中删除结点的函数x0dx0aint del_link(NODE *head,char name[])x0dx0a{x0dx0aNODE *p,*p1;x0dx0ap=head->next;x0dx0ap1=head;x0dx0awhile(p!=NULL)x0dx0a{x0dx0aif(strcmp(p->st.name,name)!=0)x0dx0a{x0dx0ap1=p;x0dx0ap=p->next;x0dx0a}x0dx0aelsex0dx0a{x0dx0abreak;x0dx0a}x0dx0a}x0dx0aif(p!=NULL)x0dx0a{x0dx0ap1->next=p->next;x0dx0afree(p);x0dx0areturn 1;x0dx0a}x0dx0aelsex0dx0a{x0dx0areturn 0;x0dx0a}x0dx0a//删除head所指的链表中,名字为name的结点,删除成功返回1,不成功返回0x0dx0a}x0dx0a//4、写出在链表中插入结点的算法x0dx0aint insert(NODE *head,student x,int wz)x0dx0a{x0dx0aNODE *p=head;x0dx0aint i=0,jg;x0dx0aif(wz<=0)x0dx0a{x0dx0ajg=0;x0dx0a}x0dx0aelsex0dx0a{x0dx0awhile(inext;x0dx0a}x0dx0aif(p==NULL)x0dx0a{x0dx0ajg=0;x0dx0a}x0dx0aif(i=wz-1)x0dx0a{x0dx0a//找到wz前面的节点,p指向它x0dx0aNODE *q;x0dx0aq=(NODE *)malloc(sizeof(NODE));x0dx0aq->st.num=x.num;x0dx0astrcpy(q->st.name,x.name);x0dx0aq->st.score=x.score;x0dx0aq->next=p->next;x0dx0ap->next=q;x0dx0ajg=1;x0dx0a}x0dx0a}x0dx0areturn jg;x0dx0a//该函数能够在wz这个结点之前,插入一个新结点,新结点的数据域为x。插入成功返回1,不成功返回0。x0dx0a}x0dx0a//5、写出主函数,分别调用上面算法所对应的程序,建立链表,并输出链表的值。x0dx0avoid main()x0dx0a{x0dx0aNODE *head; //定义指针变量headx0dx0aint wz; //表示插入位置x0dx0achar xm[30];x0dx0astudent st; //定义一个变量st,用来表示一个学生的信息x0dx0ahead=creat_link(1);x0dx0aprint_link(head); //调用函数建立链表,并把返回值送给head;x0dx0a//调用函数,输出链表中各个结点的值x0dx0a//输入一个学生的有关信息,送给变量st的有关成员x0dx0aprintf("\n\n请输入要插入的位置:");x0dx0ascanf("%d",&wz); //输入wz的值x0dx0aprintf("请输入要插入的学生的学号:");x0dx0ascanf("%d",&st.num);x0dx0aprintf("请输入要插入的学生的姓名:");x0dx0ascanf("%s",st.name);x0dx0aprintf("请输入要插入的学生的成绩:");x0dx0ascanf("%f",&st.score); x0dx0a//调用函数,在链表中把学生st的值作为一个结点插入,如果插入成功,输出新链表x0dx0aif(insert(head,st,wz)==1)x0dx0a{x0dx0aprintf("\n插入成功,新表为:\n");x0dx0aprint_link(head);x0dx0a}x0dx0aelsex0dx0a{x0dx0aprintf("插入不成功");x0dx0a}x0dx0a//调用函数,在链表中删除一个指定结点的值,如果删除成功,输出新链表x0dx0aprintf("\n\n请输入要删除的学生的姓名:");x0dx0agetchar();x0dx0agets(xm);x0dx0aif(del_link(head,xm)==1)x0dx0a{x0dx0aprintf("\n删除成功,新表为:\n");x0dx0aprint_link(head);x0dx0a}x0dx0aelsex0dx0a{x0dx0aprintf("删除不成功");x0dx0a}x0dx0a}

5. 数据结构(C语言版)中的删除链表中的一个节点

代码如下:

#include <stdio.h>

#include <stdlib.h>

typedef struct List

{

int a;

List* next;

}list;

void newList(list* l)//创建结点

{

list* a[4];

for (int i = 0; i < 4; i++)

{

a[i] = (list*)malloc(sizeof(list));

a[i]->a = i+1 ;

}

l->next = a[0];

a[0]->next = a[1];

a[1]->next = a[2];

a[2]->next = a[3];

a[3]->next = NULL;

}

void printfList(list* l)//打印结点的数据内容

{

printf("该链表的内容是: ");

while (l->next)

{

printf("%d ", l->next->a);

l = l->next;

}

printf(" ");

}

void setList(list* l,int x,int y)

{

list* head = l;

l = l->next;

while (l)

{

if (l->a >=y || l->a <=x)//将结点的数据区与指定区域进行比较

{

head->next = l;//将满足条件的结点连接在新表的最后一个结点

//指针后移

l = l->next;

head = head->next;

}

else

{

//不满足的结点进行删除

list* l1 = l;

l = l->next;

free(l1);

}

}

head->next = NULL;

}

int main()

{

list* l = (list*)malloc(sizeof(List));

newList(l);//初始化链表

printfList(l);//输出旧表内容

setList(l,1,3);//进行修改

printfList(l);//输出修改后的链表

//system("pause");

return 0;

}

(5)c语言单链表修改节点扩展阅读

链表的特点

1、插入、删除数据效率高,时间复杂度为O(1)级别(只需更改指针指向即可),随机访问效率低,时间复杂度O(n)级别(需要从链头至链尾进行遍历)。

2、和数组相比,内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针。

常用的链表类型

1、单链表

1)每个节点只包含一个指针,即后继指针。

2)单链表有两个特殊的节点,即首节点和尾节点。用首节点地址表示整条链表,尾节点的后继指针指向空地址null。

3)性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。

2、循环链表

1)除了尾节点的后继指针指向首节点的地址外均与单链表一致。

2)适用于存储有循环特点的数据,比如约瑟夫问题。

3、双向链表

1)节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)。

2)首节点的前驱指针prev和尾节点的后继指针均指向空地址。

6. C语言单链表节点

单链表的头插入: L是头结点, p是插入结点,

假设: 链表结构为 L->A->B...灶此拿

L->next=NULL;//这条语句有问题,头结点插入是不需要这句的,否则.p->next=L->next就都等于null了;
p->next=L->next;//p的下个结点指向头结点L的下个结点A,即:p的下个结点指向原第2个结点A
L->next=p;//头结点L的下个结点指向p,即将p插入到L的后面
//最终结果为:L->P->A->B...

---------------------------------------
单链表的尾插入:L是尾结点,p是插入结点,r为标记末尾结点

假设: 链表结构为 ..A->B->L

L->next=NULL;隐搭//末尾结点没有下个结点,即next指向null
r=L;//r标记末尾结点
p->next=NULL;//p待插入的末尾结点,同样没有下个结点,next指向null
r->next=p;//将末尾结点r的下个结点指向p,即:L下个扒旦结点指向p

r=p;//将r重新指向新的末尾结点p

//最终结果:A->B->L->P

7. 用C语言编写的这个链表程序可以运行,但是在运行中查找不到给定值的节点, 求高手帮忙改一下,谢谢

源程序有语法错误也有逻辑错误,列举蔽庆一二出来,其他的请自己对比修改好后的程序了。
【1】mian函数中引用的几个函数,如insert();showall();函数中没有放入参数,编译器是不能编译通过的。
【2】创建链表的函数没有返回链神并老表头指针,各种查找,删除功能是无用武之地的。
【3】自己注意带头结点的链表与不带头结点的操作方式。
【4】代码修改如下,可以正确运行。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct linknode
{
char data;
struct linknode *next;
} Mynode;

void menu();
Mynode * Create();
void find(Mynode *head,char x);
Mynode * mydelete(Mynode *head,char x);
Mynode * insert(Mynode *head,char x);
void showall(Mynode *head);

void main()
{
char c;
int choice;
Mynode *head=NULL;
menu();
printf("本代码实现链游升表的几个基本功能,请选择对应的功能选项进行相应操作:");
fflush(stdin);
scanf("%d",&choice);
while(1)
{
switch(choice)
{
case 1:
{
printf("请依次输入链表的字符序列,结束请输入'#'\n");
head = Create();
}
break;
case 2:
{
while(1)
{
printf("是否继续? y/n?");
fflush(stdin);
scanf("%c",&c);
if(c=='y')
{
find(head,c);
}
else
break;
}
}
break;
case 3:
{
while(1)
{
printf("是否继续? y/n?");
fflush(stdin);
scanf("%c",&c);
if(c=='y')
{
mydelete(head,c);
showall(head);
}
else
break;
}
}
break;
case 4:
{
while(1)
{
printf("是否继续? y/n?");
fflush(stdin);
scanf("%c",&c);
if(c=='y')
{
insert(head,c);
showall(head);
}
else
break;
}
}
break;
case 5:
{
showall(head);
}
break;
case 0:
exit(0);
}
menu();
printf("本代码实现链表的几个基本功能,请选择对应的功能选项进行相应操作:");
fflush(stdin);
scanf("%d",&choice);
}
}

void menu()
{
printf("本代码实现链表的如下几个基本功能,请选择对应的功能选项进行相应操作:\n");
printf("1.创建链表\n");
printf("2.查找字符\n");
printf("3.删除字符\n");
printf("4.插入字符\n");
printf("5.显示所有字符\n");
printf("0.退出程序\n");
}
Mynode * Create()
{
Mynode *p,*head,*s;
char x;
head=(Mynode *)malloc(sizeof(Mynode));
head->next = NULL;
p=head;
fflush(stdin);
while(1)
{
// fflush(stdin);
scanf("%c",&x);
if(x!='#')
{
s=(Mynode *)malloc(sizeof(Mynode));
s->data=x;
p->next=s;
p=s;
}
else
break;
}

p->next=NULL;
return head;
}
void find(Mynode *head,char x)
{
Mynode *p;
int i=1;
p=head->next;
printf("输入要查找的字符。");
fflush(stdin);
scanf("%c",&x);
while(p!=NULL&&p->data!=x)
{
p=p->next;
i++;
}
if(p!=NULL)
printf("结点位于第%d位\n",i);
else
printf("无此结点\n");
}
Mynode * mydelete(Mynode *head,char x)
{
Mynode *p,*q;
printf("输入要删除的字符。");
fflush(stdin);
scanf("%c",&x);
if(head==NULL)
printf("链表下溢");

q=head;
p=head->next;
while(p!=NULL&&p->data!=x)
{
if(p->data!=x)
{
q=p;
p=p->next;
}
}
if(p!=NULL)
{
q->next=p->next;
free(p);
}
else
{
printf("结点未找到.\n");
}
return head;
}
Mynode * insert(Mynode *head,char x)
{
Mynode *s,*p;
int j,i=0;
printf("输入要插入的字符。");
fflush(stdin);
scanf("%c",&x);
printf("输入插入位置。");
fflush(stdin);
scanf("%d",&i);
s=(Mynode *)malloc(sizeof(Mynode));
s->data=x;
s->next = NULL;
p=head;
j=1;
while(p->next!=NULL&&j<i)
{
j++;
p=p->next;
}
s->next = p->next;
p->next=s;
return head;
}
void showall(Mynode *head)
{
Mynode *p;

p=head->next;
while(p!=NULL)
{
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}

8. C语言单链表 求大神教教怎么修改

#include<stdio.h>
#include<stdlib.h>

typedefstructnode
{
intdata;
structnode*next;
}node;

intmain(void){
intnum;
node*p,*head;
head=NULL;
do{
scanf("%d",&num);
if(num!=-1)
{
p=(node*)malloc(sizeof(node));
p->data=num;
p->next=NULL;
if(head==NULL)
head=p;
else
p->next=head;
head=p;
}
}while(num!=-1);
while(p!=NULL){
printf("%d",p->data);
p=p->next;
}
printf(" ");
return0;
}

已经修改好了,有问题如果问错在哪可以追问

9. 数据结构c语言单链表的增删改查程序:#include <stdio.h>

没有main函数在你程序的最后加上

voidmain()
{
creates();
}

10. 急~~~功能是单链表的修改,C语言怎么写

你想怎么修改?插入、删除元素还是颂孙修改某个元素的值?
下面的程序我特意改的,实现了检查某个元素的值和修改某个元素的值,两个功能,已经调试过野察链,可以直接运行的了。如果你还想要添加其他功能,比如插入、删除等等,你再给个回复,我给你写。

#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
typedef struct LNode{
long data;
struct LNode *next;
}LNode;
LNode *Init_L(LNode *L)
{//建空链表L
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
int len_L(LNode *L)
{//求L链表中节点的个数
int len=0;
LNode *p;
p=L->next;
while(p!=NULL)
{
++len;
p=p->next;
}
printf("该链表的长度:%d\n\n",len);
return len;
}
LNode *creat_L(LNode *L)
{//创建线性表L
int i,n;LNode *q;
do{
printf("创建表:\n");
printf("表的元素个数:");
scanf("%d",&n);
LNode *p;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
q=L;
for(i=1;i<=n;++i)
{
p=(LNode *)malloc(sizeof(LNode));
printf("请输入第 %d 个数:",i);
scanf("%d",&p->data );
q->next =p;
q=q->next;q->next=NULL;
}
printf("\n创建成功!!!\n\n");
printf("想重新创建该表吗?( 若选择其它代表退出!!!)(Y:0/N:1) ");
scanf("%d",&i);
printf("\n");
}while(i==0);
return L;
}

void printf_L(LNode *L)
{//打印线性表L
LNode *p;
p=L;
printf("输出该链表:\n");
if(p->next!=NULL)
do
{
printf("%d ",p->next->data);
p=p->next;
}while(p->next!=NULL);
printf("\n\n");
}

void check_L(LNode *L)
{//检查L链表中第k个元素或这改变其内容
int i,j,k,len;
int c;
do
{
printf("请输入检没拿查的节点位置:");
scanf("%d",&k);
len=len_L(L);
if(k>len) printf("错误!!!\n\n");
}while(k>len);
LNode *p;
p=L;
for(i=1;i<=k;i++)
{
p=p->next ;
}
do
{
printf("1.检查第%d个节点的内容;\n",k);
printf("2.改变第%d个节点的内容:\n",k);
printf("( 若选择其它代表退出!!!)\n\n");
printf("请选择您要实现的功能: ");
scanf("%d",&j);
switch(j)
{
case 1: printf("其内容为: %d\n\n",p->data);break;
case 2: printf("请输入改变后的内容:");
scanf("%d",&p->data);
printf("您想检查结果吗?(Y:0/N:1)");
scanf("%d",&i);
if(i==0) printf_L(L);
break;
}
printf("您想继续检查吗(y:0/n:1)? ");
scanf("%d",&c);
}while(c==0);
return;
}
void main()
{
int t,n,k=2,i=2,v,j=7,len;
LNode *A,*B,*C,*D,*E,*F,*SUM,*SUB,*UNION;
A=creat_L(A);
check_L(A);

}