线性表的基本操作

线性表的基本操作

顺序表

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

#define INITSIZE 50

typedef int ElemType;
 
/* 顺序表 */ 
typedef struct LNode{
	ElemType *data;
	int Maxsize,lentgh;
}SqlList;

/**
** 建顺序表 
**/
SqlList init(SqlList &L){
		
	L.data=(ElemType*)malloc(sizeof(ElemType)*INITSIZE);
	L.Maxsize=100;
	L.lentgh=5;
	ElemType x;
	for(int i=0;i<L.lentgh; i++){
		scanf("%d",&x);
		L.data[i] = x;
	}
	
	return L;
}

/*
**插入 
**/
bool ListInsert(SqlList &L, int i, ElemType x){
	if(i<1 || i>L.lentgh+1){
		return false;
	}
	if(L.lentgh>=L.Maxsize){
		return false;
	}
	for (int j=L.lentgh;j>=i;j--){
		L.data[j] = L.data[j-1];
	}
	L.data[i-1] = x;
    L.lentgh++;
    return true;
	
}

/*
**删除 
**/
bool ListDelete(SqlList &L, int i, ElemType &e){
	if(i<1 || i>L.lentgh){
		return false;
	}
	e=L.data[i-1];
	for(int j=i; j<L.lentgh; j++){
		L.data[j-1] = L.data[i];
	}
	L.lentgh--;
	return true;
} 

/*
**按值查找 
**/
int LocateElem(SqlList L,ElemType e){
	for(int i=0; i<L.lentgh; i++){
		if(L.data[i]==e){
			return i+1;
		}
	}
	return 0;
}

/*
**输出 
**/
void SqlList_print(SqlList L){
	for(int i=0; i<L.lentgh; i++){
		printf("%d ",L.data[i]);
	}
	printf("\n");
}


int main() {
	SqlList L;
	
	init(L);
	SqlList_print(L);
	
	ListInsert(L,4,34);
	SqlList_print(L);

	ElemType e;
	ListDelete(L,5,e);
	SqlList_print(L);
	
	printf("值为34的元素在顺序表中的下标:%d",LocateElem(L,34));
	
    return 0;
}

单链表

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

typedef int ElemType;

/* 单链表 */ 
typedef struct LNode{
	ElemType data;
	LNode *next;
}LNode, *LinkList;

/* 头插法建立单链表   逆向建立 */
LinkList List_HeadInsert(LinkList &L){
	LNode *s;
	int x;
	L=(LinkList)malloc(sizeof(LNode)); // 创建头结点 
	L->next=NULL; // 初始化空链表 
	scanf("%d",&x);  // 输入结点的值
	while(x!=999){
		s=(LNode*)malloc(sizeof(LNode)); // 创建新结点
		s->data = x;
		s->next = L->next;
		L->next = s; // 新结点插入表中,L为头指针 
		scanf("%d",&x); 
	} 
	return L;
}

/* 尾插法建立单链表   */
LinkList List_TailInsert(LinkList &L){
	int x;
	L=(LinkList)malloc(sizeof(LNode));
	LNode *s,*r=L; //r为尾指针
	scanf("%d",&x);
	while(x!=999){
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;
		r=s;
		scanf("%d",&x);
	} 
	r->next = NULL; // 尾结点指针置空 
	return L;
} 

/* 按序号查找 
** 从第一个结点到第i个结点 
*/ 
LNode *GetElem(LinkList L, int i){
	int j=1;
	LNode *p=L->next;
	if(i==0){ // 返回头结点 
		return L;
	}
	if(i<1){ // i无效 
		return NULL;
	}
	while(p && j<i){ 
		p = p->next;
		j++;
	}
	return p; // i大于表长 
} 

/* 按值查找 */
LNode *LocateElem(LinkList L,ElemType e){
	LNode *p=L->next;
	while(p && p->data!=e){
		p=p->next;
	}
	return p; // 找到返回p,否则返回NULL 
} 

/* 
** 插入
** 在第i个位置插入元素x 
 */
LinkList List_add(LinkList L,ElemType x,int i){
	LNode *s,*p; 
	s=(LNode *)malloc(sizeof(LNode));
	p=(LNode *)malloc(sizeof(LNode));
	
	p = GetElem(L,i-1); // 找到插入点的前驱结点
	s->data = x;	
	s->next=p->next;
	p->next=s;
	
	return L;
}


/* 
** 删除
** p q,  删除q 
** 按序号删除 
*/
LinkList List_delete(LinkList &L,int i){
	LNode *q,*p; 
	q=(LNode *)malloc(sizeof(LNode));
	p=(LNode *)malloc(sizeof(LNode));
	
	// 方法1:找前驱,删除 
	p=GetElem(L,i-1);
	q=p->next; // 令q指向被删除的节点 
	p->next=q->next; // 将*q结点断开 

	// 方法2:后继赋予自身,删除后继 
//	p=GetElem(L,i);
//	q=p->next; // q为p的后继 
//	p->data=q->data; 
//	p->next=q->next; 
	 
	free(q);
	
	return L;
	 
} 

/* 
** 删除
** p q,  删除q 
** 按值删除 
*/
LinkList List_delete2(LinkList &L,ElemType x){
	LNode *q,*p; 
	q=(LNode *)malloc(sizeof(LNode));
	p=(LNode *)malloc(sizeof(LNode));
	


	// 方法2:后继赋予自身,删除后继 
	p=LocateElem(L,x);
	q=p->next; // q为p的后继 
	p->data=q->data; 
	p->next=q->next; 
	 
	free(q);
	
	return L;
	 
} 

/*
** 输出 
*/
void List_print(LinkList L){
	L=L->next;
	while(L){
	printf("%d,",L->data);
	L=L->next;
	}
	printf("\n");
	
	
}

/* 求表长 */
int List_Length(LinkList L){
	int cout=0;
	L=L->next;
	while(L){
		cout++;
		L=L->next;
	}
	return cout;
}

int main() {
	LinkList L;
	L=List_HeadInsert(L);
	
	printf("单链表中的元素:\n");
	List_print(L);
	
	printf("单链表长度:%d\n",List_Length(L));
	
	LNode *p,*q;
	p=(LNode *)malloc(sizeof(LNode));
	q=(LNode *)malloc(sizeof(LNode));
	
	p=GetElem(L,2);
	printf("单链表中第2个结点的值:%d\n",p->data);
	
	
	List_delete(L,2);
	printf("删除第2个位置的元素后的链表为:\n"); 
	List_print(L);
	
	printf("在第3个位置插入34后,新链表为:\n"); 
	List_add(L,34,3);
	List_print(L);
	
	printf("删除链表中第一个值为23的元素后,新链表为:\n");
	List_delete2(L,23);
	List_print(L);
	

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值