正文
两个链表求和函数c语言 两个链表的合并算法
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
c语言如何实现两链表合并
只要让第一个链表的尾部元素 的 next 指针,指向第二个链表的第一个元素就可以了
如果是双向链表,则除上面操作外,再让第二个链表的 prev指针指向第一个链表最后一个元素
C语言 定义一个函数实现两个集合的相加运算。(用链表的方式实现)
#include #include #include #define N 7 typedef enum { add, nul, sub, div1, yu, l, r }OP; int a[N][N] = { { 0, 0, -1, -1, -1, 1, 2 }, { 0, 0, -1, -1, -1, 1, 2 }, { 1, 1, 0, 0, 0, 1, 2 }, { 1, 1, 0, 0, 0, 1, 2 }, { 1, 1, 0, 0, 0, 1, 2 }, }; int top; OP beg; int b[1024]; OP op[1024]; void init_nu( ){ top = 0; } void push_nu( int term ){ b[top++] = term; } int pop_nu( ){ return b[--top]; } int is_empty_nu( ){ return top == 0; } void destory_nu( ) { top = 0; } void init_sign( ){ beg = 0; } void push_sign( OP sign ){ op[beg++] = sign; } void destory_sign( ){ beg = 0; } OP pop_sign( ){ return op[--beg];} OP get_sign( ){ return op[beg - 1]; } int is_empty_sign( ){return beg == 0; } int eval() { int i, j; i = pop_nu(); j = pop_nu(); switch( pop_sign() ) { case '+': push_nu( j + i ); break; case '-': push_nu( j - i ); break; case '*': push_nu( j * i ); break; case '/': push_nu( j / i ); break; case '%': push_nu( j i ); break; defult: break; } } int change( char *s ) { int i; int n = strlen( s ); for( i = 0; i n; i++ ) { if( s[i] = '0' s[i] = '0' s[i] = '9' ) push_nu( 10 * pop_nu() + s[i++] - '0' ); switch( s[i] ) { case '+': while( a[add][get_sign()] = 0 ) eval(); push_sign( add ); break; case '-': while( a[nul][get_sign()] = 0 ) eval(); push_sign( nul ); break; case '*': while( a[sub][get_sign()] = 0 ) eval(); push_sign( sub ); break; case '/': while( a[div1][get_sign()] = 0 ) eval(); push_sign( div1 ); break; case '%': while( a[yu][get_sign()] = 0 ) eval(); push_sign( yu ); break; case '(': push_sign( l ); break; case ')': while( (get_sign()) != l ) eval(); pop_sign(); break; defult: break; } } return pop_nu(); } int main( void ) { char *s = "((5-3)*2+4/22+1)"; init_nu(); init_sign(); printf( "%d\n", change( s )); destory_nu(); destory_sign(); return 0; } 以前编的,希望对你有帮助。别忘了给我分。
c语言 链表 两个 链表 求 L1∩L2 和 L1∪L2 的 程序
交集,并集?
========================================
晚上才有时间给你做,现在放出来了。
可以的话,最好能自己做出来。这才最有效果的。
//单链表
#includestdio.h
#includestdlib.h
#define ElemType int
typedef struct LNode //单链基本存储结构
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *L)
{//初始化
if(!(*L=(LinkList)malloc(sizeof(LNode))))//分配空间
exit(EXIT_FAILURE);
(*L)-next = NULL;
}
void ListInsert(LinkList *L,int i,ElemType e)
{
//插入函数
LinkList p,newNode;
int j = 0;
p = *L;
while(p ji-1) //找到插入位置的前驱
{
p = p-next;
++j;
}
if(!p || ji-1) exit(EXIT_SUCCESS); //找不到该位置则退出
if(!(newNode=(LinkList)malloc(sizeof(LNode))))
exit(EXIT_FAILURE);
newNode-data = e;
newNode-next = p-next;
p-next = newNode;
}
void CreateList(LinkList *L,int n)
{
//创建单链表函数
LinkList p,newNode;
int i;
printf("请输入元素\n");
p = *L;
for(i=0;in;++i)
{
if(!(newNode=(LinkList)malloc(sizeof(LNode))))
exit(EXIT_FAILURE);
scanf("%d",newNode-data);
newNode-next = NULL;
p-next = newNode;
p = newNode;
}
}
void display(LinkList L)
{
LinkList dis;
printf("链表:");
dis = L-next;
while(dis)
{
printf("%d ",dis-data);
dis = dis-next;
}
printf("\n");
}//union并 intersection交
void unionList(LinkList La, LinkList Lb,LinkList *Lc)
{
//求La,Lb的并集,结果存在Lc
int i;
LinkList a,b,c,newNode,temp;
a = La-next;//指向第一个结点
b = Lb-next;
c = *Lc;
while(a) //先把链表La复制到LC
{
if(!(newNode=(LinkList)malloc(sizeof(LNode)))) exit(EXIT_FAILURE);
newNode-data = a-data;
newNode-next = NULL;
c-next = newNode;
c = newNode;
a = a-next;
}
while(b)//再把链表Lb复制到Lc
{
temp = (*Lc)-next;
while(temp)
{
if(b-data==temp-data)//查找原链表是否有相同元素
break;
temp = temp-next;
}
if(temp==NULL)
{//temp等于NULL说明没有相同元素,则进行以下操作
if(!(newNode=(LinkList)malloc(sizeof(LNode)))) exit(EXIT_FAILURE);
newNode-data = b-data;
newNode-next = NULL;
c-next = newNode;
c = newNode;
}
b = b-next; //本来上面几句可以做成一个方法,但因为连接第二链表的时候
//b=b-next需要放出来,所以就不做成方法了
}
}
void intersection(LinkList La, LinkList Lb,LinkList *Lc)
{
//求La,Lb的交集,结果存在Lc
LinkList a,b,c,newNode;
a = La-next;//取得第一个结点
c = *Lc;
while(a)
{
b = Lb-next;//取得第一个结点
while(b)
{
if(b-data==a-data)
{//相等则分配空间,生成新的链表
if(!(newNode=(LinkList)malloc(sizeof(LNode)))) exit(EXIT_FAILURE);
newNode-data = b-data;
newNode-next = NULL;
c-next = newNode;
c = newNode;
break;
}
b = b-next;
}
a = a-next;
}
}
int main(void)
{
LinkList L,L2,L3;
InitList(L);//初始化
InitList(L2);
InitList(L3); //L3用于得到交/并集的结果
CreateList(L,4);//创建链表,含4个元素
CreateList(L2,4);
display(L);//显示链表
display(L2);
printf("\n");
//unionList(L,L2,L3);
intersection(L,L2,L3);
display(L3);
return 0;
}
示例,求交集
请输入元素
1
2
3
4
请输入元素
3
4
5
6
链表:1 2 3 4
链表:3 4 5 6
链表:3 4
请按任意键继续. . .
c语言,如何实现将两个链表相加
#includestdlib.h
#includestdio.h
#includemalloc.h
typedef struct datas
{
int num;
struct datas *next;
}DATAS;
DATAS *newData(int len);//创建1条数据链表 参数:节点数量 返回首节点
DATAS *addData(DATAS *datasHead1,DATAS *datasHead2);//你要的两链表相加,结构返回在新的链表中(链表节点数据对应相加,节点数量不一致,按少的算)
int main()
{
//创建3个链表头节点指针
DATAS *datasHead1;DATAS *datasHead2;DATAS *datasHead3;
datasHead1=newData(3);//测试每个链表3个节点数据,需要自己加
datasHead2=newData(3);//测试每个链表3个节点数据,需要自己加
datasHead3=addData(datasHead1,datasHead2);//测试每个链表3个节点数据,需要自己加
printf("两链表相加后,新的链表数据为:");
while(datasHead3-next!=NULL)
{
printf("%d ",datasHead3-next-num);
datasHead3=datasHead3-next;
}
return 0;
}
DATAS * newData(int len)//创建1条数据链表 参数:节点数量 返回首节点
{
int i;
DATAS *datasHead=(DATAS *)malloc(sizeof(DATAS));
DATAS *datasTail=NULL;
datasHead-next=NULL;
printf("输入%d个数 生成链表:",len);
for(i=0;ilen;i++)
{
DATAS *datasNew=(DATAS *)malloc(sizeof(DATAS));
scanf("%d",(datasNew-num));
datasNew-next=NULL;
if(datasHead-next==NULL)
datasHead-next=datasNew;
else
datasTail-next=datasNew;
datasTail=datasNew;
}
return datasHead;
}
DATAS *addData(DATAS *datasHead1,DATAS *datasHead2)
{
DATAS *datasHead=(DATAS *)malloc(sizeof(DATAS));
DATAS *datasTail=NULL;
datasHead-next=NULL;
while(datasHead1-next!=NULL datasHead2-next!=NULL)
{
DATAS *datasNew=(DATAS *)malloc(sizeof(DATAS));
datasNew-next=NULL;
datasNew-num=datasHead1-next-num+datasHead2-next-num;
if(datasHead-next==NULL)
datasHead-next=datasNew;
else
datasTail-next=datasNew;
datasTail=datasNew;
datasHead1=datasHead1-next;
datasHead2=datasHead2-next;
}
return datasHead;
}
【leetcode C语言实现】面试题 02.05-链表求和
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 - 1 - 6) + (5 - 9 - 2),即617 + 295
输出:2 - 1 - 9,即912
进阶:假设这些数位是正向存放的,请再做一遍。
示例:
输入:(6 - 1 - 7) + (2 - 9 - 5),即617 + 295
输出:9 - 1 - 2,即912
当两个整数相加时,从个位开始,依次将两个数的对应位置进行相加,将所得结果的个位数作为相加后对应位置的结果,若有进位将进位的值在更高一位进行相加。此处两个数是以链表存储,同样的思路,依次将两个数的对应位置进行相加,并将所得结果保存到一个链表中。
运行结果:
两个链表求和函数c语言的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于两个链表的合并算法、两个链表求和函数c语言的信息别忘了在本站进行查找喔。