#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data; //数据
struct LNode *next; //后继节点的指针
}LNode,*LinkList; //LinkList是头指针类型,LNode是节点类型
void CreateLNode(LinkList *L,int i); //创建长度为i的链表L
int ListInsert(LinkList *L,int i,int e); //在位置i上插入e元素
int ListDelete(LinkList *L,int i,int *e); //在位置i上删除节点并将元素用e传出
int GetElem_LNode(LinkList L,int i,int *e); //获得位置i上的节点用e传出
void MergeList_LNode(LinkList *La,LinkList *Lb,LinkList *Lc); //将La,Lb链表合并用Lc传出
int main()
{
LinkList La,Lb,Lc;
int num; //节点储存的数
int la,lb,lc; //链表长度
printf("请输入La链表的个数:");
scanf("%d",&la);
CreateLNode(&La,la);
// printf("请输入Lb链表的个数:");
// scanf("%d",&lb);
// CreateLNode(&Lb,lb);
// MergeList_LNode(&La,&Lb,&Lc);
printf("La链表中的数为:\n");
for (int i = 1; i <= la; i++)
{
GetElem_LNode(La,i,&num);
printf("%d\n",num);
}
// printf("在第三个位置插入3\n");
// ListInsert(&L,3,3);
// for (int i = 1; i <= Len; i++)
// {
// GetElem_LNode(L,i,&num);
// printf("%d\n",num);
// }
system("pause");
return 0;
}
void CreateLNode(LinkList *L,int i) //用尾插法创造一个链表长度为i
{
LinkList p,r; //p指针用来新增节点,r是尾指针
*L=(LinkList)malloc(sizeof(LNode));
r=(LinkList)malloc(sizeof(LNode));
(*L)->next=NULL; //初始化头指针
r=(*L); //将尾指针指向头指针
for (int j = 0; j < i; j++)
{
p=(LinkList)malloc(sizeof(LNode)); //创建新的节点
scanf("%d",&p->data); //将输入的元素赋值给p->data
p->next=NULL; //令p的后继节点为NULL
r->next=p; //将p节点插入尾部
r=r->next; //尾指针移动到尾部
}
}
int ListInsert(LinkList *L,int i,int e) //再带头节点的线性表L中的第i个位置插入元素e
{
LinkList p,s; //p指针用来寻找节点位置,s节点用来生成新节点
int j=0;
p=*L; //p指针指向头节点
while (p&&j<i-1) //p开始寻找i的位置
{
p=p->next;
j++;
}
if (!p||j>i)
{
return 0; //若找不到则返回0
}
s=(LinkList)malloc(sizeof(LNode)); //生成新的节点
s->data=e; //将元素e给s节点
s->next=p->next; //让s的后继指针指向p的后记节点
p->next=s; //将p的后记节点改成s
return 1;
}
int ListDelete(LinkList *L,int i,int *e) //删除第i个元素,并返回值e
{
ListDelete p,q; //p指针用来寻找位置i前一个元素,q指针用来传出值e
int j=0;
p=*L;
while (p->next&&j<i-1)
{
p=p->next;
j++;
}
if (!(p->next)||j>i)
{
return 0;
}
q=p->next;
p->next=p->next->next;
*e=q->data;
free(q);
return 1;
}
int GetElem_LNode(LinkList L,int i,int *e) //获得位置i上的节点用e传出
{
LinkList p; //p指针用来寻找
p=L->next;
int j=1;
while (p&&j<i)
{
p=p->next;
j++;
}
if (!p||j<i)
{
return 0; //没找到返回0
}
*e=p->data; //将找到的元素用指针*e传出
return 1; //找到返回1
}
void MergeList_LNode(LinkList *La,LinkList *Lb,LinkList *Lc) //将La,Lb链表合并用Lc传出
{
LinkList pa,pb,pc;
pa=(*La)->next;
pb=(*Lb)->next;
(*Lc)=pc=(*La);
while (pa&&pb)
{
if (pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(*Lb);
}
C语言实现链表
最新推荐文章于 2024-04-09 10:00:00 发布