线性表——链式存储实现

什么是链式存储:

1:用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置。
2:链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址(指针)。
3:存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。这两部分信息组成数据元素称为存储映像,称为结点(Node)。

在这里插入图片描述

单链表的删除插入操作:

在这里插入图片描述

代码实现:查找,初始化,插入,删除—操作实现

/*srand(time(0))?;//先设置种子
rand();//然后产生随机数
Srand是种下随机种子数,你每回种下的种子不一样,用Rand得到的随机数就不一样。
为了每回种下一个不一样的种子,所以就选用Time(0),Time(0)是得到当前时时间值
(因为每时每刻时间是不一样的了)。
*/
#include <time.h>
#include <iostream>
using namespace std;
#include <stdlib.h>    //malloc(),free(),srand(),rand()的头文件 
#define MAXSIZE 20
#define OK 1
#define ERROR 0 
typedef int ElemType;
typedef int Status;

typedef struct Node
{
ElemType data;      // 数据域
struct Node* Next;  // 指针域
} Node;
typedef struct Node* List;



/* 操作结果:用e返回L中第i个数据元素的值 */
Status  GetElem(Node *L, int i, ElemType *e){
	
	List p;
	p = L;
	int j = 1; 
	for( ; j <= i&& p ; j++){
		p = p->Next;
	}
	
	if(!p  ){
		return ERROR;
	}
	*e = p->data;
	return OK; 
}

/* 操作结果:删除L的第i个数据元素,并用e返回其值. */
Status ListDelete(Node *L,int i, ElemType *e){
	List p,q;
	p = L;
	int j = 1;
	while(p->Next && j < i){
		p = p->Next;
		j++;
	}
	if(!(p->Next) || j > i){
		return ERROR;
	}
	*e = p->Next->data;
	
	q = p->Next->Next;	
	
	free(p->Next);
	
	p->Next = q;
	
	/*  q = p->next;    p->next = q->next;    free(q); 也可这么写*/ 
	
	
	return OK; 
}

/* 操作结果:在L中第i个位置之前插入新的数据元素e. */
Status ListInsert(Node *L, int i, ElemType e){
	List p,s;
	p = L;
	int j = 1;
	while(p && j< i){
		p = p->Next;
		j++;
	}
	if(!p || j > i){
		return ERROR;
	}
	
	s = (List ) malloc(sizeof(Node));   //  sizeof()是操作符,不需要添加头文件 
	s->data = e;
	s->Next = p->Next;
	p->Next = s;
	return OK;   
	
}

/* 头插法建立单链表示例 */
void CreateListB(List *L, int n){
	Node *p;
	
	//srand(time (0));
	
	*L = (List)malloc(sizeof(Node));  // 生成头结点 
	 
	(*L)->Next = NULL;
	for(int i = 0 ; i < n ; i++ )  {
		 p = (List)malloc(sizeof(Node));
		 p->data = rand()%10+1;
		 p->Next = (*L)->Next;
		 (*L)->Next = p; 
	}
	 
}

/* 尾插法建立单链表演示 */
void CreateListA(List *L, int n){
	List p , r; 
	//srand(time(0));
	*L = (List)malloc(sizeof(Node));
	r = *L; 
	for(int i = 0 ; i < n ; i++){
		
		p = (List) malloc(sizeof(Node));
		p->data = rand()%10+1;
		r->Next = p;
		p->Next = NULL;
		r = p; 
	}
	//cout<<L->data;
}


/*打印整个链表*/
void PrintfList(Node *L){
	
	Node *p = L->Next;
	while(p){
		cout<<p->data<<"  ";
		p = p->Next;
	}
	cout<<endl; 
}

int main(){
		
	cout<<"头插法检测"<<endl; 
	Node *headA;
	CreateListA(&headA,5);
	PrintfList(headA); 
	
	
	/*检测,查找,插入,删除操作*/
	ElemType i = 0;
	cout<<"查找位置1的元素"<<endl; 
	GetElem( headA , 1, &i); 
	cout<<i<<endl; 
	cout<<"删除位置1的元素"<<endl; 
	ListDelete(headA,1, &i); 
	PrintfList(headA); 
	cout<<"位置1插入元素"<<endl;
	ListInsert(headA, 1 , i);
	PrintfList(headA); 
	
	cout<<"----------------------------------------------------------------------"<<endl;
	cout<<"尾插法检测"<<endl; 	
	Node *headB;
	CreateListB(&headB,5);
	PrintfList(headB); 
	/*检测,查找,插入,删除操作*/
	ElemType I = 0;
	cout<<"查找位置1的元素"<<endl; 
	GetElem( headB , 1, &I); 
	cout<<I<<endl; 
	cout<<"删除位置1的元素"<<endl; 
	ListDelete(headB,1, &I); 
	PrintfList(headB); 
	cout<<"位置1插入元素"<<endl;
	ListInsert(headB, 1 , I);
	PrintfList(headB); 
	
	
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_44923545/article/details/106248626
今日推荐