《数据结构》进行曲(二)顺序表的链式表示(1)

前端之家收集整理的这篇文章主要介绍了《数据结构》进行曲(二)顺序表的链式表示(1)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 100

//-----单链表的存储结构---- 
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;

 //单链表的初始化
 int InitList(LinkList &L){
 	//构造一个空的单链表
	 L=new LNode;
	 L->next=NULL;
	 return 1;
 } 
 
 //判断链表是否为空
 int EmptyList(LinkList L){
 	if(L->next){
 		return 0;//非空 
 	}else{
 		return 1;//链表为空 
 	}
 } 
 
 //获取链表长度
 int ListLength(LinkList L){
 	int length=0;
 	struct LNode *p;
 	p=L->next;
 	while(p){
 		length++;
 		p=p->next;
 	}
 	return length;
 } 
 //遍历单链表
 void TraveList(LinkList L){
 	struct LNode *p;
 	p=L->next;
 	printf("链表结果如下:\n");
 	while(p){
 		printf("%d ",p->data);
 		p=p->next;
 	}
 	printf("\n");
 } 
 
 //查找
 //1.按序号查找
 int SelectByNo(LinkList L,int i,int &e){
 	//在带头结点的单链表中查找第i个值 
 	struct LNode *p;
 	p=L->next;//初始化,p指向第一个结点 
 	int j=1;//j用来计数
 	while(p&&j<i){//顺着链域扫描,直到p指向第i个元素,或者p为空 
 		p=p->next;
 		++j;
 	}
 	if(!p||j>i){
 		return 0;
 	}
 	e=p->data;
 	return 1;
 }
 
 //2.按值查找
 LNode *SelectByValue(LinkList L,int e){
 	//在带头结点的单链表中查找值为e的元素
	 struct LNode *p;
	 while(p&&p->data!=e){
	 	p=p->next; 
	 } 
	 return p;
 } 
 
 /*
 插入操作 
 */
 int ListInsert(LinkList &L,int &e){
 	//在单链表的第i个位置之前插入元素e
	 int j=0;
	 struct LNode *p;
	 p=L;
	 while(p&&j<i-1){//寻找第i-1个结点 
	 	p=p->next;
	 	++j;
	 } 
	 if(!p||j>i){
	 	return 0;
	 }
	 struct LNode *s;
	 s=new LNode;//生成新结点s
	 s->data=e; //将新结点的数据域置为e
	 s->next=p->next;//将新结点插入L中 
	 p->next=s;
	 return 1; 
 }
 
 /*
 删除操作 
 */
 int ListDelete(LinkList &L,int e){
 	//删除链表l中的第i个位置的元素,并用e返回其值
	 struct LNode *p;
	 p=L;
	 int j=0;
	 while(p&&j<i-1){//寻找地i-1个结点 
	 	p=p->next;
	 	++j;
	 } 
	 if(!(p->next)||j>i-1){
	 	return 0;
	 }
	 struct LNode *q;
	 q=p->next;//临时保存要删除的结点的地址以备释放
	 p->next=q->next;
	 e=q->data;
	 delete q;
	 return 1; 
 }
 //前插法创建单链表
 void CreateList(LinkList &L,int n){
 	 //建立带头结点的单链表L,输入n个元素的值
	 L=new LNode;//先建立一个带头结点的空的单链表
	 L->next=NULL;
	 printf("输入n个元素的值:\n");
	 for(int i=0;i<n;i++){
	 	struct LNode *p;
	 	p=new LNode;//生成新结点
		printf("请输入第%d个元素的值:",i+1);
		scanf("%d",&p->data);
		p->next=L->next;
		L->next=p; 
	 } 
	 
 }
 
 int main(){
 	LinkList L;
 	
 	InitList(L);
 	if(EmptyList(L)){
 		printf("链表为空.\n");
 	}else{
 		printf("链表非空.\n");
 	}
 	
 	printf("请输入链表中元素的个数:\n");
 	int n;
 	scanf("%d",&n);
 	CreateList(L,n);
 	
 	TraveList(L);
 	printf("当前链表长度是:%d\n",ListLength(L));
 	
 	printf("请输入要查找元素在链表中的位置:\n");
 	int location;
 	scanf("%d",&location);
	int e1;
	if(SelectByNo(L,location,e1)){
		printf("%d位置元素的值是:%d\n",e1);
	}else{
		printf("查找失败!\n");
	}
	
	printf("输入要查找元素的值:\n");
	int e2;
	scanf("%d",&e2);
	LNode *p;
	p=SelectByValue(L,e2);
	printf("位置:%d\n",p);
 	
 	printf("请输入插入元素的位置和值:\n");
 	int e,location1;
 	scanf("%d%d",&location,&e);
 	ListInsert(L,e);
 	TraveList(L);
 	
 	printf("请输入要删除元素的位置:\n");
 	int location2;
 	scanf("%d",&location2);
 	int e3;
 	ListDelete(L,location2,e3);
 	printf("要删除的元素值是:%d\n",e3);
 	TraveList(L);
 	
 	return 0;
 }
原文链接:https://www.f2er.com/datastructure/382557.html

猜你在找的数据结构相关文章