线性表---顺序存储和链式存储

前言

搁置了这么久,总算决定腾出时间整理一下数据结构,就先从线性表开始吧

顺序表(线性表的顺序存储)

#include<stdio.h>
#define MAXSIZE 1000013


//存储结构 
typedef int ElemType;
typedef struct {
    
    
	ElemType elem[MAXSIZE];
	int length;
}SeqList;

void Init_SeqList(SeqList* L);//初始化
int Insert_SeqList(SeqList* L,int i,ElemType x); //顺序表的插入 
int Delete_SeqList(SeqList* L,int i,ElemType* x); //顺序表的删除 
int Location_SeqList(SeqList* L,ElemType x); //按值查找 
void merge(SeqList* A,SeqList* B,SeqList* C); //合并两个顺序表 
int main(){
    
    
	//此部分省略 
}

void Init_SeqList(SeqList* L) {
    
    
	L->length = 0;
}
int Insert_SeqList(SeqList* L,int i,ElemType x) {
    
    
	int j;
	if(L->length == MAXSIZE -1 ){
    
    
		printf("表满!");
		return 0;
	}
	if(i<1 || i>L->length+1 ){
    
    		//检查插入位置合法性
		printf("位置错!")
		return 0;
	}
	for(j=L->length;j>=i;j--){
    
    
		//给要插入的位置腾出空间 
		L->elem[j+1] = L->elem[j];
	}
	
	L->elem[i] = x;
	L->length++;
	return 1;

}
int Delete_SeqList(SeqList* L,int i,ElemType* x) {
    
    
	
	int j;
	
	if(i<1 || i>L->length){
    
    
		printf("不存在第i个元素");
		return 0;
	}
	
	*e = L->elem[i];
	
	for(j=i;j<=L->length-1;j++){
    
    
		//从第i处开始全体前移
		L->elem[j] = L->elem[j+1]; 
	}
	L->length--;
	return 1;
}
int Location_SeqList(SeqList* L,ElemType x) {
    
    
	int i = 1;
	while(i<=L->length && L->elem[i] != x){
    
    
		i++; 
	}
	if(i>L->length) return 0;
	else return i;
}
void merge(SeqList* A,SeqList* B,SeqList* C) {
    
    
	//	A,B都是升序,合并后的C也是升序 
	int i,j,k;
	i=1,j=1,k=1;
	while(i<=A->length && j<=B->length){
    
    
		if(A->elem[i] <= B->elem[j]){
    
    
			C->elem[k++] = A->elem[i++]; 
		} else {
    
    
			C->elem[k++] = B->elem[i++]; 
		}
		
		while(i <= A->length){
    
    
			C->elem[k++] = A->elem[i++]; 
		}
		while(j <= B->length){
    
    
			C->elem[k++] = B->elem[j++]; 
		}
		 C->length = A->length + B->length;
	}
}



单链表:

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

typedef int DataType;

typedef struct node {
    
    
	DataType data; //数据域 
	struct node* next; //指针域 
}LNode,*LinkList;

LinkList Creat_LinkListH();//头插法建立单链表 
LinkList Creat_LinkListT();//尾插法建立单链表
int Length_LinkList(LinkList H);//求单链表的长度 
void Print_List(LinkList H);//打印单链表 
LinkList Get_LinkList(LinkList H,int k);//单链表按序号查找
LNode* Locate(LinkList H,int x);//单链表按值查找
int Insert_LinkList(LinkList H,int i,int x);//单链表的插入
int Del_LinkList(LinkList H,int i);//单链表的删除
void Reverse(LinkList H);//单链表的逆置
void Pur_LinkList(LinkList H);//删除单链表重复元素
void Difference(LinkList H); //两个链表的差
 
int main() {
    
    
	// 主函数省略 
}

LinkList Creat_LinkListH() {
    
    
	LinkList H = (LinkList)malloc(sizeof(LNode)); // 生成头结点
	H->next = NULL;
	
	LNode* s;
	int x;
	scanf("%d",&x);
	while(x != -1){
    
    
		s = (LinkList)malloc(sizeof(LNode));
		s->data = x;
		s->next = H->next;
		H->next = s;
		scanf("%d",&x);
	} 
	return H; //返回头指针 
}
LinkList Creat_LinkListT() {
    
    
	LinkList H = (LinkList)malloc(sizeof(LNode));
	H->next = NULL;
	LNode *s,*r = H;
	int x;
	scanf("%d",&x);
	while(x != -1){
    
    
		s = (LinkList)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		scanf("%d",&x);
	}
	r->next = NULL;
	return H;
}
void Print_List(LinkList H) {
    
    
	LNode* p = H->next;
	
	while(p){
    
    
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
} 
int Length_LinkList(LinkList H) {
    
    
	LNode* p = H;
	int j = 0;
	while(p->next){
    
    
		p=p->next;
		j++;
	}
	return j;
}
LinkList Get_LinkList(LinkList H,int k) {
    
    
	LNode* p = H;
	int j = 0;
	while(p->next && j<k){
    
    
		p=p->next;
		j++;
	}
	if(j==k) return p;
	else return NULL;
}
LNode* Locate(LinkList H,int x) {
    
    
	LNode* p = H->next;
	
	while(p && p->data != x){
    
    
		p=p->next;
	}
	return p;	
} 
int Insert_LinkList(LinkList H,int i,int x) {
    
    
//	在单链表第i个位置上,插入值为x的新结点 
	LNode* p,*s;
	p=Get_LinkList(H,i-1);//查找第i-1个结点
	if(!p){
    
    
		printf("插入位置错误!\n");
		return 0;
	} else {
    
    
		s = (LinkList)malloc(sizeof(LNode));//申请新结点
		s->data = x;
		s->next = p->next;
		p->next = s;
		return 1; 
	}
} 
int Del_LinkList(LinkList H,int i) {
    
    
	//删除单链表H上的 第 i 个结点
	LinkList p,q;
	p=Get_LinkList(H,i-1); //拿到第 i-1 个结点
	if(!p){
    
    
		printf("第i-1个结点不存在\n");
		return 0;
	} else if(p->next == NULL){
    
    
		printf("第i个结点不存在\n");
		return 0;
	} else {
    
    
		q = p->next;//指向第i个结点
		p->next = q->next; // 删除
		free(q);
		return 1; 
	}	
}
void Reverse(LinkList H) {
    
    
	LNode *p,*q;
	p = H->next;
	H->next = NULL;
	while(p){
    
    
		//	利用头插法存储 数据逆着存储 特点 实现逆置	
		q = p;
		p=p->next;
		q->next = H->next;
		H->next = q;
	}
}

void Pur_LinkList(LinkList H) {
    
    
//	删除单链表重复结点 
	LNode *p,*q,*r;
	p = H->next;
	
	if(p){
    
    	
		while(p->next){
    
    
			q = p;
			while(q->next){
    
    
				if(q->next->data == p->data){
    
    
					r = q->next;
					q->next = r->next;
					free(r);
				} else {
    
    
					q = q->next;
				}
			}
			p = p->next;
		}
	}
} 

猜你喜欢

转载自blog.csdn.net/qq_51368103/article/details/121295082