数据结构复习ya--线性表

/*呜呜希望大佬能指点错误,跪谢*/

一.顺序表

// 1)顺序表的基本操作:
typedef struct{
	int number;		//学号
	char name[20];	//姓名 
}ElemType;

typedef struct{
	ElemType data[Max];
	int length;
	int listsize;
}Sqlist;
//	初始化
int initSqlist(Sqlist *L){
	L->length=0;
	L->listsize=Max;
	return 1;
} 
//	插入
int insertSqlist(Sqlist *L,int i,ElemType e){
	int k;
	if(i<1||i>L->length||L->length>=L->listsize){
		printf("插入失败\n");
		return 0;
	}
	else{
		for(k=L->length-1;k>=i-1;k--)
			L->data[k+1]=L->data[k];
		L->data[i-1]=e;
		L->length=L->length+1;
		return 1;
	}
}
//	创建
int creatSqlist(Sqlist *L){
	int k,i;
	ElemType e;
	initSqlist(L);
	printf("请输入创建信息数目\n");
	scanf("%d",&k);
	for(i=0;i<k;i++){
		printf("请输入第%d条信息\n",i+1);
		scanf("%d%s",&e.number,e.name);
		getchar();
		insertSqlist(L,i+1,e);
	}
	return 1;
}
//	删除
int deletSqlist(Sqlist *L,int i){
	int k;
	if(i<1||i>L->length||L->length==0){
		printf("删除失败\n");
		return 0;
	}
	else{
		for(k=i-1;k<L->length-1;k++)
			L->data[k]=L->data[k+1];
		L->length--;
		return 1;		
	}
}
//	查找
int locationSqlist(Sqlist L,char a[]){
	int i;
	if(L.length==0){
		printf("空表,查找失败\n");
		return 0;
	}
	else{
		for(i=0;i<L.length;i++)
			if(strcmp(L.data[i].name,a)==0)	return i;
		return 0;
	}
	
}
//	修改
int changeSqlist(Sqlist *L,int i,char a[]){
	if(i<1||i>L->length||L->length==0){
		printf("修改失败\n");
		return 0;
	}
	strcpy(L->data[i-1].name,a);
	return 1;
}
//	遍历
int travelSqlist(Sqlist L){
	int i;
	if(L.length==0){
		printf("空表,遍历失败\n");
		return 0;
	}
	else{
		for(i=0;i<L.length;i++)
			printf("%d	%s\n",L.data[i].number,L.data[i].name);
		return 1;
	}
}
//	输出
int outputSqlist(Sqlist L,int i){
	if(i<1||i>L.length||L.length==0){
		printf("输出失败\n");
		return 0;
	}
	else{
		printf("%d	%s\n",L.data[i-1].number,L.data[i-1].name);
		return 1;
	}
}
//	有序归并
Sqlist combineSqlist(Sqlist L,Sqlist R){
	Sqlist T;
	int i;
	initSqlist(&T);
	int p=0,q=0;
	while(p<L.length&&q<R.length){
		if(L.data[p].number<R.data[q].number){
			T.data[i++]=L.data[p];
			p++;
		}	
		else{
			T.data[i++]=R.data[q];
			q++;
		}
	}
	while(p<L.length){
		T.data[i++]=L.data[p];
		p++;
	}
	while(q<R.length){
		T.data[i++]=R.data[q];
		q++;
	}
	return T;
}

二.单链表

// 2)带头结点单链表的基本操作:
typedef struct node{
	int data;
	struct node *next;
}Node,*LinkList; 
//初始化
int initLinkList(LinkList *L){
	(*L)=(LinkList)malloc(sizeof(Node));
	if((*L)==NULL){
		printf("初始化失败\n");
		exit(0);
	}
	(*L)->next=NULL;
	return 1;
} 
//	插入(头插、尾插、任意位置插入)
//a.头插
int firstinsert(LinkList L,int a){
	LinkList s;
	s=(LinkList)malloc(sizeof(Node));
	if(s==NULL){
		printf("插入失败\n");
		return 0;
	}
	s->data=a;
	s->next=L->next;
	L->next=s;
	return 1;
} 
//b.尾插(L是空表)
int lastinsert(LinkList L,int a){
	LinkList s,R=L;
	s=(LinkList)malloc(sizeof(Node));
	if(s==NULL){
		printf("插入失败\n");
		return 0;
	}
	while(R->next!=NULL){
		R=R->next;
	}
	s->data=a;
	s->next=R->next;
	R->next=s;
	return 1;
} 
//c.任意位置插入
int insert(LinkList L,int i,int a){
	LinkList s,p=L;
	int pos=0;
	s=(LinkList)malloc(sizeof(Node));
	if(s==NULL||i<1){
		printf("插入失败\n");
		return 0;
	}
	while(p!=NULL&&pos<i-1){
		p=p->next;
		pos++;
	}
	if(p==NULL){
		printf("插入失败\n");
		return 0;
	}
	s->data=a;
	s->next=p->next;
	p->next=s;
	return 1;
} 
//	创建(尾插法)
int creatLinkList(LinkList *L){
	int i,m,a;
	initLinkList(L);
	printf("请输入要创建的数目\n");
	scanf("%d",&m);
	for(i=0;i<m;i++){
		printf("请输入第%d个信息:\n",i+1);
		scanf("%d",&a);
		lastinsert(*L,a); 
	} 
	return 1;
}
//	删除(头删、尾删、任意位置删除)
//a.头删
int firstdelet(LinkList L){
	LinkList p;
	int m,i;
	printf("请输入要删除的数目\n");
	scanf("%d",&m);
	for(i=0;i<m;i++){
		p=L->next;
		L->next=p->next;
		free(p);
	}
	return 1;
} 
//b.尾删
int lastdelet(LinkList L){
	LinkList p=L,q=L->next;
	while(q->next!=NULL){
		p=p->next;
		q=q->next;
	}
		p->next=q->next;
		free(p);
	return 1;
} 
//c.任意位置删除 
int delet(LinkList L,int i){
	LinkList q=L,p;
	int pos=0;
	while(q->next!=NULL&&pos<i-1){
		q=q->next;
		pos++;
	}
	if(i<1||q->next==NULL){
		printf("删除失败\n");
		return 0;
	}
	p=q->next;
	q->next=p->next;
	free(p);
	return 1;
} 
//	查找
int locationLinkList(LinkList L,int a){
	int i=1;
	LinkList p=L->next;
	while(p->data!=a&&p!=NULL){
		i++;
		p=p->next;
	}
	if(p==NULL){
		printf("查找失败\n");
		return 0;
	}
	printf("查找数值位置为:%d",i);
	return 1;
}
//	修改
int changeLinkList(LinkList L,int i,int a){
	int pos=0;
	LinkList p=L;
	while(p!=NULL&&pos<i){
		pos++;
		p=p->next;
	}
	if(p==NULL)	return 0;
	p->data=a;
	return 1; 
}
//	输出
int outputLinkList(LinkList L){
	LinkList p=L->next;
	while(p!=NULL){
		printf("%d	",p->data);
		p=p->next;
	}
	 return 1;
}
//	求表长
int lengthLinkList(LinkList L){
	int i=0;
	LinkList p=L;
	while(p!=NULL){
		i++;
		p=p->next;
	}
	printf("表长%d\n");
	return 1;
} 
//	逆序
int inverLink(LinkList L){
	LinkList p=L->next;
	L->next=NULL;
	while(p!=NULL){
		firstinsert(L,p->data);
		p=p->next;
	}
	return 1;
}
//	有序插入(从小到大)
int youxuinsert(LinkList L,int a){
	LinkList p=L,s;
	s=(LinkList)malloc(sizeof(Node));
	s->data=a; 
	while(p->next!=NULL){
		if(a<p->next->data)	{
			s->next=p->next;
			p->next=s;
			break;
		}
		p=p->next;
	} 
	if(p->next==NULL){
		s->next=p->next;
		p->next=s;
	}
	return 1;
}
//	单链表的有序归并
LinkList unionLinkList(LinkList L,LinkList R){
	LinkList p=L->next,q=R->next,T,t=T,s;
	initLinkList(&T);
	while(p!=NULL&&q!=NULL){
		s=(LinkList)malloc(sizeof(Node));
		if(p->data<q->data){
			s->data=p->data;
			s->next=t->next;
			t->next=s;
			t=s;
			q=q->next;
		}
		if(p->data>=q->data){
			s->data=p->data;
			s->next=t->next;
			t->next=s;
			t=s;
			p=p->next;
		}
	} 
	while(p!=NULL){
		s=(LinkList)malloc(sizeof(Node));
		s->data=p->data;
		s->next=t->next;
		t->next=s;
		t=s;
		p=p->next;
	}
	if(q!=NULL){
		s=(LinkList)malloc(sizeof(Node));
		s->data=p->data;
		s->next=t->next;
		t->next=s;
		t=s;
		q=q->next;
	}
	return T;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值