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语言中链表怎么删除结点
有分才有动力啊哥们。
删除节点很简单,以单链表为例,牢记三点
避免断链,删除掉节点后,前一个节点的p->next一定要指向后一个节点(如果是头节点,记得要将新表头P指向到原来的第二个节点。如果是尾节点,记得要将新的尾节点p->next置为NULL,)。
避免野指针,删除掉节点后,p->next=NULL;
避免内存泄漏,删除的节点,要用free释放堆内存。
如果是双向链表,不过是多了一个对prev操作,道理是一样的。
4. 如何用C语言创建一个链表,实现增、删、改、查
#include
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);
}