📄 链表.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 + -