数据结构——单向链表操作

//链表操作(单向链表)

#include<stdio.h>
#include<malloc.h>

//定义链表
typedef struct LNode{		//定义单链表节点类型
	int data;				//数据域
	struct LNode *next;		//指针域
}LNode;

//****************建立单链表

//头插法

LNode* CreatListHead(LNode *L){
	//从表尾到表头逆向建立单链表L,每次均在头结点之后插入元素
	LNode *s;int x;
	L=(LNode*)malloc(sizeof(LNode));
	L->next=NULL;
	scanf("%d",&x);
	while(x!=9999){
		s=malloc(sizeof(LNode));
		s->data=x;
		s->next=L->next;
		L->next=s;
		scanf("%d",&x);
	}
	return L;
}

//尾插法
LNode* CreatListEnd(LNode *L){
	//从表头到表尾正向建立单链表L,每次均在表尾插入元素
	int x;
	LNode *s,*r;
	L=(LNode*)malloc(sizeof(LNode));
	r=L;
	scanf("%d",&x);
	while(x!=9999){
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;
		r=s;
		scanf("%d",&x);
	}
	r->next=NULL;
	return L;
}

//按序号查找节点值

LNode* GetElemNode(LNode* L,int i){
	int j=1;
	LNode *p=L->next;
	if(i==0)
		return L;
	if(i<1)
		return NULL;
	while(p&&j<i){
		p=p->next;
		j++;
	}
	if(j!=i)  return NULL;
	return p;
}

//按值查找节点值

LNode* LocateElem(LNode* L,int e){
	LNode *p=L->next;
	while(p&&p->data!=e){
		p=p->next;
	}
	return p;
}

//插入节点

void InsertNode(LNode* L,int i,int e){
	LNode *p;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	p=GetElemNode(L,i-1);
	s->data=e;
	s->next=p->next;
	p->next=s;
}

//删除节点

void DeleteNode(LNode* L,int i){
	LNode *p;
	LNode *s;
	p=GetElemNode(L,i-1);
	s=p->next;
	p->next=s->next;
	free(s);
}

//求链表长度
int Length(LNode *L){
	LNode *p=L->next;
	int i=0;
	while(p){
		i++;
		p=p->next;
	}
	return i;
}

//输出链表

void PrintList2(LNode *L){
	LNode *p=L->next;
	while(p){
		printf("%d   ",p->data);
		p=p->next;
	}
}
int main(){
	LNode *L=NULL;
	int e,i;
	//L=CreatListHead(L);
	//生成链表
	printf("***************生成链表***************\n");
	printf("输入链表数据(以9999为结束标志)\n");
	L=CreatListEnd(L);
	printf("输入的链表长度为:");
	printf("%d\n",Length(L));
	printf("\n链表数据为:");
	PrintList2(L);
	//插入数据
	printf("\n***************插入数据***************");
	printf("\n请输入需要插入的节点数据和插入位置:");
	scanf("%d %d",&e,&i);
	InsertNode(L,i,e);
	printf("链表长度为:");
	printf("%d\n",Length(L));
	printf("\n链表数据为:");
	PrintList2(L);
	//删除节点
	printf("\n***************删除节点***************");
	printf("\n请输入需要删除的节点:");
	scanf("%d",&i);
	DeleteNode(L,i);
	printf("链表长度为:");
	printf("%d\n",Length(L));
	printf("\n链表数据为:");
	PrintList2(L);
}

猜你喜欢

转载自blog.csdn.net/agjllxchjy/article/details/81275204