【数据结构】链表的基本操作

//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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值