数据结构之链表(c语言实现),判断两个非空单向链表是否有公共结点,是,返回结点,否则返回NULL。

数据结构之链表(c语言实现)

题目:判断两个非空单向链表是否有公共结点,是,返回结点,否则返回NULL。
分析:这种情况只能是尾部有公共结点,结点是公共的,说明尾结点地址是相同的,则可以找出尾结点的地址,这就需要二级指针建栈来存储地址,来比较栈顶数据是否相同,若相同,则有公共尾结点,否则,则无公共结点。

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
 int data;
 struct node * next;
}ElemSN;

ElemSN * createlink(int data[],int n)
 {
  ElemSN *h=NULL,*t,*newp;
  int i; 
  for( i=0;i<n;i++)
  {
   newp=(ElemSN *)malloc(sizeof(ElemSN));
   newp->data=data[i];
   newp->next=NULL;
 if(!h)
   h=t=newp;
 else
 t=t->next=newp;
 } 
 return h;
 }
ElemSN * IfTogerther(ElemSN*h1,ElemSN*h2)//运用栈,将p的地址依次入栈。
 {
 	ElemSN **s1,**s2,*p;//s1,s2为栈。
	int top1,top2;
	s1=(ElemSN**)malloc(100*sizeof(int));
	s2=(ElemSN**)malloc(100*sizeof(int));
	top1=top2=-1;
	for(p=h1;s1[top1++]=p;p=p->next);//将h1链表的结点地址依次入栈
	for(p=h2;s2[top2++]=p;p=p->next);//将h2链表的结点地址依次入栈
	while(top1!=-1&&top2!=-1&&s1[top1]==s2[top2]){
		top1--;
		top2--;
	}//比较栈中元素,不相同则跳出循环
	p=s1[top1+1];//p指向不相同的上一个结点。
	free(s1);
	free(s2);
	return p;
 
 }
 void printlink(ElemSN *h)
 {
  ElemSN *p;
  p=h;
  for(p=h;p;p=p->next)
  printf("%5d",p->data);
 }
 int main(void)
{
 int data[8]={1,2,3,4,5,6,7,8};
 ElemSN *head1,*head2,*h;
 head1=createlink(data,8);
 head2=createlink(data,8); 
 h=IfTogerther(head1,head2);
 printlink(h);
}
发布了14 篇原创文章 · 获赞 0 · 访问量 309
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览