数据结构线性表

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
#define ok 1
#define error 0
typedef struct{
	int*elem;//开辟数组地址 
	int length;//长度 
}sqlist;

int initlist(sqlist*p)//构造空顺序表 
{p->elem=(int*)malloc(sizeof(int)*MAXSIZE);//开辟空间 
	if(!p->elem)//如果开辟不了 
	{return error;
	}
	p->length=0;//长度为0 
	return ok;
}

int listinsert(sqlist*p,int i,int e)//在l的第i个位置之前插入元素e
{int k;
if(p->length==MAXSIZE){//如果顺序表满了 
	return error;
}
	if(i<1||i>p->length+1){//如果输入的位置i不存在 
		return error;
	}
	for(k=p->length-1;k>=i-1;k--)//从后往前元素后移 找到位置插入 
	{p->elem[k+1]=p->elem[k];
	}
	p->elem[i-1]=e;
	p->length++;//长度加一 
	return ok;
} 

int listdelete(sqlist*p,int i,int* e)//删除l的第i个位置的元素,并用e返回 
{int k;
if(i<1||i>p->length+1){//如果输入的位置i不存在 
	return error;
	}
	if(p->length==0){//如果顺序表为空 
		return error;
		}
	*e=p->elem[i-1];//将第i个位置元素用e返回 
	for(k=i;k<=p->length-1;k++){//从前往后覆盖掉这个元素 
		p->elem[k-1]=p->elem[k];
	}
	p->length--;//长度减一 
return ok;
}

int getelem(sqlist*p,int i,int*e)//获取l第i个位置上的元素
{if(p->length==0||i<1||i>p->length){//如果输入的位置i不存在
	return error;
}
*e=p->elem[i-1];
return ok;	
 } 
 
int getindex(sqlist*p,int*e)//按值查找返回位置 
{int i;
	for(i=1;i<=p->length;i++)
	{if(p->elem[i-1]==*e)
	return i;
	}
	return error;	
}

void output(sqlist*p)//输出线性表 
{int i;
printf("当前顺序表长度为%d\n",p->length);
for(i=0;i<=p->length-1;i++)
{printf("%d ",p->elem[i]);
}
printf("\n");
}

void union1(sqlist*p,sqlist*q)//合并去重 
{int i;int e;
	for(i=1;i<=q->length;i++){
		getelem(q,i,&e);//获得q每一个元素的值 
		if(!getindex(p,&e)){//如果在p中找到了对应下标 
			 listinsert(p,p->length+1,e);
		}
	}	
}

void mergelist(sqlist*p,sqlist*q,sqlist*c)//合并单增 
{c->length=p->length+q->length;//让c的长度为p,q之和 
c->elem=(int*)malloc(sizeof(int)*c->length);//开辟c内存 
int*phead=p->elem;int*qhead=q->elem;int*plast=p->elem+p->length-1;int*qlast=q->elem+q->length-1;//定义pq头尾指针 
int*chead=c->elem;//定义c头指针 
while(phead<plast&&qhead<qlast){//当pq指针没到末尾时 
	if(*phead>=*qhead){//如果p指向的大于q 则q加入c 
		*chead++=*qhead++;//cq指针后移一位 
	}
	else{如果p指向的小于q 则p加入c 
		*chead++=*phead++;//cp指针后移一位 
	}
}
while (phead<=plast) *chead++ = *phead++;	// Lb到达表尾,将La中剩余元素加入Lc
	while (qhead <= qlast) *chead++ = *qhead++;	// La到达表尾,将Lb中剩余元素加入Lc
}

int main(){
	int i;
sqlist p;//不能构造一个空指针,因为没有开辟内存 
initlist(&p);
for(i=1;i<=10;i++)
{listinsert(&p,i,i);
}
output(&p);
sqlist q;initlist(&q);
for(i=1;i<=5;i++)
{listinsert(&q,i,i+7);
}
output(&q);
sqlist c;
mergelist(&p,&q,&c);
output(&c);
	return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define ok 1
#define error 0
typedef struct node{
	int data;//数据 
	 struct node*next;//存储指向下一个结点的指针 
}node,*linklist;
//指针 原因:若不采用双重指针,则在构造单链表时无法改变传入的l指向 

int initnode(linklist*l)//构造单链表   二重指针 
{*l=(node*)malloc(sizeof(node));//建立头节点 
(*l)->next=NULL;
(*l)->data=0;//长度 
return ok;
}

int getvalue(linklist l,int i,int*e)//获取l第i个位置上的元素
{if(i<=0||i>l->data){//如果输入的位置i不存在 
	return error;
}
linklist p;
p=l;int j=0;//p从头节点开始 
while(p&&j<i){//p不为空且j一直加到i 
	p=p->next;
	j++;
}
if (p==NULL || j > i)return error;//如果p为空 
*e= p->data;//否则将e记录p的值 
return ok;
}

int getindex(linklist l,int e)//返回位置 
{linklist p;
p=l->next;int j=1;//p从第一个结点开始 
while(p&&p->data!= e){//如果p不为空且没找到 
	p=p->next;
	j++;
}
	if(p)return j;//找到了 
	else return error;
}

int insert(linklist l,int i,int e)//在第i个元素前插入 
{if(i>l->data+1||i<=0){//如果输入的位置i不存在 
	return error;
}
int j=0;linklist p=l;//p从头节点开始 
for(j=0;j<i-1;j++){//到要插入结点之前的一个节点 
	p=p->next;
}
linklist nn=(node*)malloc(sizeof(node));//新建结点 
nn->data=e;
nn->next=p->next;//将第i个结点地址赋给新节点的指针域 
	p->next=nn;//将新节点的地址赋给p的指针域 
	l->data++;//长度增加 
	return ok;
}

int deletenode(linklist l,int i,int*e)//删除第i个结点 
{if(i>l->data||i<1){//如果i不存在 
	return error;
}
int j=0;linklist p=l;//p从头节点开始 
for(j=0;j<i-1;j++){//到要删除结点的前一位 
	p=p->next;
}
linklist q=p->next;//记录要删除节点 
p->next=p->next->next//;将要删除结点下一个与前一个连接 
*e=q->data;
free(q);//删除结点 
	l->data--;//长度减一 
	return ok;
}

void backcreate(linklist*l,int n)//尾插法 
{*l=(node*)malloc(sizeof(node));
(*l)->next=NULL;
(*l)->data=0;//长度 
linklist last;//定义尾指针 
last=*l;//初始化为头指针 
printf("请依次输入数据:\n");
int i;
for(i=0;i<n;i++){
	linklist p=(node*)malloc(sizeof(node));//新节点 
	scanf("%d",&(p->data));
	p->next=NULL;
	last->next=p;
	last=p;//移动尾指针 
	(*l)->data++;
}
}

void show(linklist l)
{linklist p;
	p = l->next;
	printf("长度为%d\n",l->data);
	while (p)
	{
		printf("%d\t",p->data);
		p = p->next;
	}
printf("\n");
}

void merge(linklist p,linklist q,linklist c)//合并有序序列 
{linklist phead=p->next;//定义p指针指向p第一个节点 
linklist qhead=q->next;//定义q指针指向q第一个节点
linklist chead=c;//定义c指针 
while(phead&&qhead){//当pq存在 
	if(phead->data<=qhead->data){
		chead->next=phead;
		chead=chead->next;
		phead=phead->next;
	}
	else{
		chead->next=qhead;
		chead=chead->next;
		qhead=qhead->next;
	}
	}
chead->next = phead ? phead : qhead;//剩下的加入 
c->data=p->data+q->data;//长度增加 
}
	
	
	
	

int main()
{linklist l;int i;linklist q;linklist c;
initnode(&l);initnode(&q);initnode(&c);
for(i=1;i<=10;i++){
	insert(l,i,i);
}
for(i=1;i<=10;i++){
	insert(q,i,i+3);
}
show(q);
printf("%d",getindex(q,10));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值