#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));
}