数据结构与算法:链表实战(增删查改)

本文详细介绍了如何使用C语言实现链表的头插法、尾插法创建链表,以及链表的按位置查找、按值查找、在特定位置插入元素和删除元素的方法。
摘要由CSDN通过智能技术生成

一、头插法新建链表

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode{
	ElemType data; //数据域
	struct LNode *next;
}LNode,*LinkList;

//LNode*是结构体指针,和LinkList完全等价 
//输入3、4、5、6、7、9999 
void list_head_insert(LNode* &L){
	L=(LinkList)malloc(sizeof(LNode)); //为头指针申请空间 ,头指针指向头结点 
	L->next=NULL;
	ElemType x;
	scanf("%d",&x);
	LNode *s; //用来指向申请的新结点 
	while(x!=9999) {
		s=(LinkList)malloc(sizeof(LNode));
		s->data=x;
		s->next=L->next; //s的next指向原本链表的第一个结点
		L->next=s; //头结点的next指向新结点 
		scanf("%d",&x);
	}
}

void print_list(LinkList L){
	L=L->next;
	while(L!=NULL){
		printf("%3d",L->data);
		L=L->next;
	}
	printf("\n");
}
//头插法新建链表
int main(){
	LinkList L; //L是链表头指针,是结构体指针类型 
	list_head_insert(L);
	print_list(L);
	return 0;
}

二、尾插法新建链表

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode{
	ElemType data; //数据域
	struct LNode *next;
}LNode,*LinkList;

//LNode*是结构体指针,和LinkList完全等价 
//输入3、4、5、6、7、9999 
void list_tail_insert(LNode* &L){
	L=(LinkList)malloc(sizeof(LNode)); //为头指针申请空间 ,头指针指向头结点 
	L->next=NULL;
	ElemType x;
	scanf("%d",&x);
	LNode *s,*r=L; //s用来指向申请的新结点 ,r始终指向链表尾部 
	while(x!=9999) {
		s=(LinkList)malloc(sizeof(LNode)); //为新结点申请空间 
		s->data=x;
		r->next=s; //新结点给尾结点的next指针 
		r=s; //r指向新的尾部 
		scanf("%d",&x);
	}
	r->next=NULL; //让尾结点的next为NULL 
}
void print_list(LinkList L){
	L=L->next;
	while(L!=NULL){
		printf("%3d",L->data);
		L=L->next;
	}
	printf("\n");
}
//尾插法新建链表
int main(){
	LinkList L; //L是链表头指针,是结构体指针类型 
	list_tail_insert(L);
	print_list(L);
	return 0;
}

三、链表按位置查找及按值查找

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode{
	ElemType data; //数据域
	struct LNode *next;
}LNode,*LinkList;

//LNode*是结构体指针,和LinkList完全等价 
//输入3、4、5、6、7、9999 
void list_tail_insert(LNode* &L){
	L=(LinkList)malloc(sizeof(LNode)); //为头指针申请空间 ,头指针指向头结点 
	L->next=NULL;
	ElemType x;
	scanf("%d",&x);
	LNode *s,*r=L; //s用来指向申请的新结点 ,r始终指向链表尾部 
	while(x!=9999) {
		s=(LinkList)malloc(sizeof(LNode)); //为新结点申请空间 
		s->data=x;
		r->next=s; //新结点给尾结点的next指针 
		r=s; //r指向新的尾部 
		scanf("%d",&x);
	}
	r->next=NULL; //让尾结点的next为NULL 
}
void print_list(LinkList L){
	L=L->next;
	while(L!=NULL){
		printf("%3d",L->data);
		L=L->next;
	}
	printf("\n");
}

//按位置查找 
LinkList GetElem(LinkList L,int SearchPos){
	int i=0;
	if(SearchPos<0)
	   return NULL;
	while(L&&i<SearchPos){
		L=L->next;
		i++;
	}
	return L;
}

//按值查找
 LinkList LocateElem(LinkList L,ElemType SearchVal){
 	while(L){
 		if(L->data==SearchVal){ //如果找到对应的值,就返回结点的地址 
 			return L;
		 }
		 L=L->next;
	 }
	 return NULL; 
 } 

int main(){
	LinkList L,search; //L是链表头指针,是结构体指针类型 
	list_tail_insert(L);
	print_list(L);
	//按位置查找
	 search=GetElem(L,2);	 
	 if(search!=NULL){
	 	printf("Succeeded in searching by serial number\n");
	 	printf("%d\n",search->data);
	 }
	 //按值查找 
	 search=LocateElem(L,6);	 
	 if(search!=NULL){
	 	printf("Search by value succeeded\n");
	 	printf("%d\n",search->data);
	 }
	return 0;
}

四、往第i个位置插入元素

 

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode{
	ElemType data; //数据域
	struct LNode *next;
}LNode,*LinkList;

//LNode*是结构体指针,和LinkList完全等价 
//输入3、4、5、6、7、9999 
void list_tail_insert(LNode* &L){
	L=(LinkList)malloc(sizeof(LNode)); //为头指针申请空间 ,头指针指向头结点 
	L->next=NULL;
	ElemType x;
	scanf("%d",&x);
	LNode *s,*r=L; //s用来指向申请的新结点 ,r始终指向链表尾部 
	while(x!=9999) {
		s=(LinkList)malloc(sizeof(LNode)); //为新结点申请空间 
		s->data=x;
		r->next=s; //新结点给尾结点的next指针 
		r=s; //r指向新的尾部 
		scanf("%d",&x);
	}
	r->next=NULL; //让尾结点的next为NULL 
}
void print_list(LinkList L){
	L=L->next;
	while(L!=NULL){
		printf("%3d",L->data);
		L=L->next;
	}
	printf("\n");
}

//按位置查找 
LinkList GetElem(LinkList L,int SearchPos){
	int i=0;
	if(SearchPos<0)
	   return NULL;
	while(L&&i<SearchPos){
		L=L->next;
		i++;
	}
	return L;
}
 
 bool ListFrontInsert(LinkList L,int InsertPos,ElemType InsertVal){
 	LinkList p=GetElem(L,InsertPos-1);
 	if(p==NULL)
 	   return false;
 	LinkList q;
 	q=(LinkList)malloc(sizeof(LNode)); 
 	q->data=InsertVal;
 	q->next=p->next;
 	p->next=q;
 	return true;
 }

int main(){
	LinkList L,search; //L是链表头指针,是结构体指针类型 
	list_tail_insert(L);
	ListFrontInsert(L,2,99);
	print_list(L);
	return 0;
}

 五、单链表删除

#include <stdio.h>
#include <stdlib.h>
 
typedef int ElemType;
typedef struct LNode{
	ElemType data; //数据域
	struct LNode *next;
}LNode,*LinkList;
 
//LNode*是结构体指针,和LinkList完全等价 
//输入3、4、5、6、7、9999 
void list_tail_insert(LNode* &L){
	L=(LinkList)malloc(sizeof(LNode)); //为头指针申请空间 ,头指针指向头结点 
	L->next=NULL;
	ElemType x;
	scanf("%d",&x);
	LNode *s,*r=L; //s用来指向申请的新结点 ,r始终指向链表尾部 
	while(x!=9999) {
		s=(LinkList)malloc(sizeof(LNode)); //为新结点申请空间 
		s->data=x;
		r->next=s; //新结点给尾结点的next指针 
		r=s; //r指向新的尾部 
		scanf("%d",&x);
	}
	r->next=NULL; //让尾结点的next为NULL 
}
void print_list(LinkList L){
	L=L->next;
	while(L!=NULL){
		printf("%3d",L->data);
		L=L->next;
	}
	printf("\n");
}
 
//按位置查找 
LinkList GetElem(LinkList L,int SearchPos){
	int i=0;
	if(SearchPos<0)
	   return NULL;
	while(L&&i<SearchPos){
		L=L->next;
		i++;
	}
	return L;
}
 
//删除第i个位置的元素
//删除时L是不会变的,所以不需要加引用
bool ListDelete(LinkList L,int i){
	LinkList p=GetElem(L,i-1);// 删除结点的前一个结点 
	if(p==NULL)
	   return false;
	LinkList q=p->next; //拿到要删除的结点指针 
	p->next=q->next; //断链 
	free(q); 
	return true;
} 
int main(){
	LinkList L; //L是链表头指针,是结构体指针类型 
	list_tail_insert(L);
	//按位置查找
	ListDelete(L,4); 
	print_list(L);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值