正文
链表复制函数c语言 链表的复制构造函数
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
c语言结构体(链表)操作函数
if中可以赋值给head的理由很简单。
因为 if(PTScount(head) == 0)
if判断的就是看它是不是 第一个元素。
如果是第一个元素,自然直接将ins赋值给head。
head所代表的就是第一个元素。
如果到了else这里,那么很明显就不是第一个元素了。
那这个时候肯定就不可以直接复制给head了呀,因为head可是代表第一个元素呀。
所以,你这是肯定改不了的。
关于c语言链表函数
#includestdio.h#includewindows.h#include stdio.h#include malloc.h#include stdlib.h//定义数据类型名称typedef int DataType;#define flag -1 //定义数据输入结束的标志数据//单链表结点存储结构定义typedef struct Node{ DataType data; struct Node *next;}LNode ,*LinkList;//建立单链表子函数 LNode *Create_LinkList(){ LNode *s,*head,*L;int i=0,x; //定义指向当前插入元素的指针 while(1) { scanf("%d",x); if(-1==x) { return head; break;} s= (LNode *)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间 s-data =x; s-next =NULL; i++; if(i==1) head=s; else L-next =s; L=s; }}//查找子函数(按序号查找)LNode *Get_LinkList(LinkList L,int i){ LNode *p; int j; //j是计数器,用来判断当前的结点是否是第i个结点 p=L; j=1; while(p!=NULLji) { p=p-next ; //当前结点p不是第i个且p非空,则p移向下一个结点 j++; } return p;}//插入运算子函数void Insert_LinkList(LinkList L,int i,DataType x) //在单链表L中第i个位置插入值为x的新结点{ LNode *p,*s; p =Get_LinkList(L,i); //寻找链表的第i-1个位置结点 if(p==NULL) { printf("插入位置不合法!"); exit(-1); } else { s= (LinkList)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间 s-data =x; s-next =p-next ; p-next =s; }}//单链表的删除运算子函数void Delete_LinkList(LinkList L,int i) //删除单链表上的第i个结点{ LNode *p,*q; p=Get_LinkList(L,i-1); //寻找链表的第i-1个位置结点 if(p==NULL) { printf("删除的位置不合法!"); //第i个结点的前驱结点不存在,不能执行删除操作 exit(-1); } else { if(p-next ==NULL) { printf("删除的位置不合法!"); //第i个结点不存在,不能执行删除操作 exit(-1); } else { q=p-next ; p-next =p-next-next; free(q); } }}//求表长运算子函数int Length_LinkList(LinkList L){ int l; //l记录L的表长 LNode *p; p=L; l=1; while(p-next) { p=p-next; l++; } return l;}int main (){ LNode *head,*p; head=(LinkList)malloc(sizeof(LNode)); int x,y; a: printf("*******menu*******\n"); printf("**创建**********1*\n"); printf("**插入**********2*\n"); printf("**删除**********3*\n"); printf("**表长**********4*\n"); printf("**清屏**********5*\n"); printf("**打印**********6*\n"); printf("**退出******other*\n"); printf("******************\n"); int i=1; while(i) { printf("请输入选项:"); scanf("%d",i); switch(i) { case 1:head=Create_LinkList(); getchar();break; case 2:printf("请输入位置和数据;"); scanf("%d%d",x,y); Insert_LinkList(head,x,y);break; case 3:printf("请输入位置;"); scanf("%d",x); Delete_LinkList(head,x);break; case 4:printf("%d",Length_LinkList(head));break; case 5:system("cls");goto a; case 6:p=head; while(p!=NULL) {printf("%d\n",p-data); p=p-next;} break; default :i=0; } }}
我把创建给改了一下
链表的建立
//c语言实现链表的建立,按逆序复制
#includestdio.h
#includestdlib.h
struct node
{
int info;//节点信息
struct node *next;
};
struct node *Create(int *numnode)
{//创建一个链表
struct node *head,*tail,*cnew;
head=NULL;
int num;
printf("输入数据(以零结束):");
while(1)
{
scanf("%d",num);
if(num==0)//输入为零表示输入结束
break;
cnew=(struct node*)malloc(sizeof(struct node));
cnew-info=num;
cnew-next=NULL;
if(head==NULL)//若为空则将头节点指向新节点
head=cnew;
else
tail-next=cnew;//将当前节点的next指向新的节点
tail=cnew;
(*numnode)++;
}
return head;
}
struct node *ReverseCopy(struct node *head1,int *numnode)
{//复制链表函数反向复制
struct node *p,*head,*q;
head=NULL;//初始化为空
for(q=head1;q!=NULL;q=q-next)
{//根据head1链表来建立新的链表
p=(struct node *)malloc(sizeof(struct node));
p-info=q-info;//将head1链表的数据元素复制到新的节点中
p-next=head;//将新节点的的next指向头节点
head=p;
//将head移向新的节点,for语句结束head就指向了最后建立的节点处即head1的最后一个节点处
//每次插入都是在head和新节点之间移动
(*numnode)++;
}
return head;
}
void show(struct node *head)
{//遍历链表输出
struct node *p;
if(head==NULL)
{
printf("链表为空,没有数据\n");
return;
}
printf("\n-----链表的数据元素------\n");
for(p=head;p!=NULL;p=p-next)
printf("%d ",p-info);
printf("\n");
}
int main()
{
struct node *head1,*head2;
int numnode1,numnode2;
numnode1=numnode2=0;
head1=head2=NULL;
//初始化将节点个数初始化为零
head1=Create(numnode1);
show(head1);
printf("\n链表head1的节点个数为:%d\n",numnode1);
head2=ReverseCopy(head1,numnode2);
//调用复制函数,完成复制
show(head2);
printf("\n链表head2的节点个数为:%d\n",numnode2);
return 0;
}
关于c语言课程设计链表的两个问题。。(高分求助) 非常急。。。。!!。
#include iostream
using namespace std;
struct NODE
{
int data;
NODE *next;
};
void dataAdd(NODE *(list),int data) //在链表尾增加一个新的节点
{
NODE *newNode,*p;
newNode=new NODE;
newNode-data=data;
p=list;
if(!p) //如果list为空,头结点赋值为当前值
{
list=newNode;
list-next=NULL;
return ;
}
while(p-next)
{
p=p-next;
}
p-next=newNode;
newNode-next=NULL;
}
void inputData(NODE *(list))
{
int data;
cindata;
while(!cin.fail())
{
dataAdd(list,data);
cindata;
}
cin.clear();
cin.sync();
}
int lastData(NODE *list)
{
NODE *p=list;
if(!p)
{
return -1;
}
while(p-next)
{
p=p-next;
}
return p-data;
}
void sortList(NODE *(list))
{
NODE *p,*q;
p=list;
int temp;
while(p-next)
{
q=p-next;
while(q)
{
if(p-dataq-data)
{
temp=p-data;
p-data=q-data;
q-data=temp;
}
q=q-next;
}
p=p-next;
}
}
void combination(NODE *list1,NODE *list2,NODE *(list3))
{
NODE *p=list1;
NODE *q=list2;
while(p q)
{
if(p-data q-data )
{
if(lastData(list3)!=p-data)
dataAdd(list3,p-data);
p=p-next;
}
else if(p-data q-data)
{
if(lastData(list3)!=q-data)
dataAdd(list3,q-data);
q=q-next;
}
else if(p-data == q-data)
{
if(lastData(list3)!=p-data)
dataAdd(list3,p-data);
p=p-next;
q=q-next;
}
}
while(p)
{
if(lastData(list3)!=p-data)
dataAdd(list3,p-data);
p=p-next;
}
while(q)
{
if(lastData(list3)!=q-data)
dataAdd(list3,q-data);
q=q-next;
}
}
void showList(NODE *list) //显示链表中的数据
{
NODE *p;
p=list;
while(p)
{
coutp-data' ';
p=p-next;
}
coutendl;
}
int main()
{
NODE *list1=NULL,*list2=NULL;
cout"请输入链表1的数据,非数字字符为结束符!"endl;
inputData(list1);
sortList(list1); //list1排序
//showList(list1);
coutendl;
cout"请输入链表2的数据,非数字字符为结束符!"endl;
inputData(list2);
sortList(list2); //list2排序
NODE *list3=NULL;
cout"list1和list2的并集为:"endl;
combination(list1,list2,list3);
showList(list3);
coutendl;
return 0;
}
C语言中,如何把一个链表的内容复制到另一个"非空"链表去?
要看具体要求链表复制函数c语言,如果仅仅是加在另一个链表后面链表复制函数c语言,不考虑排序链表复制函数c语言,可以直接建立一个新链表,把链表链表复制函数c语言的内容复制到新链表,然后再把新链表接到非空链表后,你都没给具体数据结构,所以代码没法写,思路是这样
关于链表复制函数c语言和链表的复制构造函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。