⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 链表.c

📁 一个关于连个链表合并成为一个链表的程序
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#define null NULL
typedef struct Node//定义链表节点
{ int data;
  struct Node *next;
}Node;
typedef Node *Plinklist;

void Creatlist(Plinklist *A)//创建有序链表
{ //int i,n;//n为链表中元素个数
  Plinklist newbase,p,r,p1;char a='a';
  char *file;
  FILE *fp;
  file=&a;
  //printf("请输入文件名\n");
  //scanf("%s",file);
//  getchar();
  
  newbase=(Plinklist)malloc(sizeof(Node));//分配地址
  if(!newbase) exit(-2);
  (*A)=newbase;
  (*A)->next=null;
  p=p1=(*A);//p为头节点//第一次写成p=(*A)->next不行!!头接点是(*)A它本身而不是(*A)->next
 
 // scanf("%d",&n);//输入链表所含元素个数
  //getchar();  //接收回车或空格
 // printf("请输入链表的所有元素\n ");
// for(i=0;i<n;i++)//链表中含n个值
//  {
  if((fp=fopen("d:\\diyi.txt","r"))==NULL)
	  exit(0);
  while(!feof(fp))
  {
	 Plinklist q;
     q=(Node *)malloc(sizeof(Node));//给q分配地址
	 //scanf("%d",&(q->data));//输入此节点的数据域的值
	 q->data=fgetc(fp)-48;
//	 getchar();//接收回车或空格
	 p1->next=q;//使q接在上个节点后
	 p1=q;
  }
//  }
 p1->next=null;//最后一个节点的next为空
 for(r=p;r->next!=null;)
  r=r->next;//使r指向表尾
  r->next=p;//使r指向头指针,那么p为循环链表
  fclose(fp);
  return;
}

void Mergelist(Plinklist A,Plinklist B,Plinklist *C)//归并两个链表,用(*C)返回
{ Plinklist la,lb,lc,p,q;
  p=lc=(*C)=A;//使(*C)首先指向A
  la=A->next;
  q=B;
  lb=B->next;
  while(la!=p&&lb!=q)   //当la和lb都不指向头节点时使lc等于比较后较小的节点
  {
	  if(la->data<=lb->data)
	  {
		  lc->next=la;
		  lc=lc->next;
		  la=la->next;
	  }
	  else
	  {
		  lc->next=lb;
		  lc=lc->next;
		  lb=lb->next;
	  }
  }
		    
 
  if(la==p)//如果la已经指向头接点
  {
	  while(lb!=q)
	  {
		  lc->next=lb;
		  lc=lc->next;
		  lb=lb->next;
	  }
  }

 else
 {
	 while(la!=p)
	 {
		 lc->next=la;
		 lc=lc->next;
		 la=la->next;
	 }
 }
 lc->next=(*C);//使归并后链表为循环链表
 return;
}
void Printf_list(Plinklist L)//打印输出归并后的链表
{ Plinklist p,q;
  q=L;
  p=L->next;
  while(p!=L)//当p不指向头节点时,说明遍历没有完成
  {
	  printf("%d ",p->data);//打印输出各节点的数据
	  p=p->next;//p后移
  }
  putchar('\n');
  return;
}
void main()
{   Plinklist M,N,list;
 //   printf("请输入第一个链表的元素个数:\n");
	Creatlist(&M);//创建两个链表
//	printf("请输入第二个链表的元素个数\n");
	Creatlist(&N);
	Mergelist(M,N,&list);//递归合并到list中
	Printf_list(list);//打印list中的元素
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -