typedef int elemtype; 定义elemtype为int类型
//链表有数据域和指针域
struct lnode{
elemtype data;
lnode* next;//指向相同类型的指针
};
typedef lnode* linklist; 给结构体更名
//链表输出 因为创建的链表含有头结点,所以新设了一个变量p,使p=L->next;如果没有头结点的话,完全可以不设p
void show(linklist L){
linklist p;
p=L->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//链表的初始化
/给链表分配空间 ,即就是创建头结点,给头结点分配空间
新创建的结点,其next指针都不能悬空
输入的时候分 头插和尾插,头插法:每一次在头结点的后面插入数据 即s->next=l->next; l->next=s;两句的顺序千万不能颠倒
尾插法:需要记录链表的尾端 即tail->next=s;tail=s; 把s挂接在尾端
在创建链表的时候若L->NULL是没有头结点的,若L->next=NULL代表是有头结点的/
void created_L(linklist& L,int n){
linklist s,tail;
L=(lnode*)malloc(sizeof(lnode));//创建了头结点
L->next=NULL;
tail=L;
for(int i=0;i<n;i++){
s=(lnode*)malloc(sizeof(lnode));
s->next=NULL;
cin>>s->data;
tail->next=s;
tail=s;
}
// show(L);
}
//链表的插入 不像顺序表一样记录位置 ,linklist后面的&可以不用加
//找到第i个元素 因为链表中没有length,所以要时刻预防链表为空的时候即 l->=NULL的时候
void insertlist(linklist L,int i,elemtype e){
int j=1;
linklist s,p;
p=L;
while(p&&j<i){
p=p->next;
j=j+1;
}
if(j==i){
s=(lnode*)malloc(sizeof(lnode));
s->next=NULL;
s->data=e;
s->next=p->next;
p->next=s;
}
show(L);
}
//链表的删除
void deletelist(linklist& L,int i,elemtype& e){
linklist pl,p;
int j=1;
p=L;
while(p&&j<i){
p=p->next;
j=j+1;
}
if(j==i){
pl=p->next;
p->next=pl->next;
e=pl->data;
free(pl);//删除完释放节点
}
show(L);
}
//找到指定元素
void getelem(linklist L,elemtype e){
linklist p;
p=L->next;
while(p){
if(p->data==e)
cout<<p->data<<" ";
p=p->next; //不要想的那么复杂,用不到else
}
}
/*两个链表的合并
la lb升序,合成升序的lc ,la lb比较小的接在lc的尾端,
la lb逆序,合成降序的lc,la lb比较小的插在lc头结点的后面(头插法可以实现逆序)
1.先创建一个新表
*/
void mergelist(linklist& la,linklist& lb,linklist& lc){
linklist pa,pb,pctail;
lc=la;
pa=la->next;
lc->next=NULL;
pb=lb->next;
pctail=lc;
free(lb);
while(pa&&pb){
if(pa->data<=pb->data){
pctail->next=pa;
pctail=pa;
pa=pa->next;
}
else{
pctail->next=pb;
pctail=pb;
pb=pb->next;
}
}
while(pa){
pctail->next=pa;
pctail=pa;
pa=pa->next;
}
while(pb){
pctail->next=pb;
pctail=pb;
pb=pb->next;
}
show(lc);
}
在main函数中调用
int main(){
int e=0;
linklist p,q,m;
created_L(p,5);
created_L(q,5);
insertlist(p,3,8);
cout<<endl;
deletelist(p,3,e);
cout<<endl;
getelem(p,3);
cout<<endl;
mergelist(p,q,m);
return 0;
}