//author:东方肖海 QQ:467064265
//version:1.0
//顺序表的合并算法
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
//定义结构体
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode;
typedef LNode *LinkList; //见书p26,LinkList L = LNode *L都是说指针
//头插入法构造单链表,输出的结果是逆序
LinkList CreateList_L1()
{
LinkList L;
LinkList p;
int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x);
while(x!=-1)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=x;
p->next=L->next;
L->next=p;
scanf("%d",&x);
}
return L;
}
//尾插入法构造单链表,输出结果为正序
LinkList CreateList_L2()
{
LinkList L,p,r;
int x;
r=L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x);
while(x!=-1)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=x;
p->next=NULL;
r->next=p;
r=p;
scanf("%d",&x);
}
return L;
}
//求表长
int ListLength_L(LinkList L)
{
int i=0;
LinkList p=L;
while(p->next!=NULL)
{
i++;
p=p->next;
}
return i;
}
//查找单链表中的第i个节点
LinkList Get_LinkList(LinkList L,int i)
{
LinkList p=L;
int j=0;
while(p->next!=NULL&&j<i)
{
p=p->next;
j++;
}
if(j==i)
{
return p;
}
else
{
return NULL;
}
}
//查找单链表中值为x的节点
int Locate_LinkList(LinkList L,ElemType x)
{
int j=0;
while(L->data!=x&&L->next!=NULL)
{
L=L->next;
j++;
}
if(L->next==NULL)
{
return -1;
}
else
{
return j;
}
}
//在单链表的第i节点前插入值为x的元素
LinkList ListInsert(LinkList L,int i,ElemType x)
{
LinkList S,p=L;
int j=0;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL||j>i-1)
{
printf("参数i错误\n");
exit(1);
}
S=(LinkList)malloc(sizeof(LNode));
S->data=x;
S->next=p->next;
p->next=S;
return L;
}
//删除单链表中第i个数据节点
LinkList ListDelete(LinkList L,int i)
{
ElemType e;
LinkList p,q;
int j;
j=0;
p=L;
q=L->next;
while(q->next&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL||j>i-1)
{
printf("参数i错\n");
exit(1);
}
q=p->next;
p->next=q->next;
e=q->data;
printf("被删除的值是%d\n",e);
free(q);
return L;
}
//销毁链表
void LinkListDestroy(LinkList L)
{
free(L);
}
//打印链表内容
void printLinkList(LinkList L)
{
LinkList p;
p=L->next;
while(p!=NULL)
{
printf("%3d",p->data);
p=p->next;
}
}
int main()
{
LinkList L1,L2;
printf("头插入法输入L1链表,以-1结束\n");
L1=CreateList_L1();
printf("尾插入法输入L2链表,以-1结束\n");
L2=CreateList_L2();
printf("\nL1的长度是:%d\n",ListLength_L(L1));
printf("\nL1: ");
printLinkList(L1);
printf("\nL2的长度是:%d\n",ListLength_L(L2));
printf("\nL2: ");
printLinkList(L2);
printf("\n接下来测试在L1中插入某节点,请输入插入节点的位置和值,如3,30\n");
int i,num;
scanf("%d,%d",&i,&num);
ListInsert(L1,i,num);
printLinkList(L1);
printf("\n接下来测试在L2中删除某节点,请输入删除节点的位置,如3\n");
scanf("%d",&i);
ListDelete(L2,i);
printLinkList(L2);
printf("接下来是查找L1中的第i个节点,请输入i的值:");
scanf("%d",&i);
LinkList p=Get_LinkList(L1,i);
printf("%d节点的值为:%d",i,p->data);
printf("接下来是查找L2中值为num节点的位置,请输入num的值:");
scanf("%d",&num);
int j=Locate_LinkList(L2,num);
printf("值为%d的节点为%d",num,j);
return 0;
}
【数据结构】链表的基本操作
最新推荐文章于 2021-07-12 06:45:58 发布