前天写的,对指针有了更深刻的理解,感觉现在就是任我拿捏了,初学者也练练啊。
自己在后边测试了下,感觉没问题。
/*单链表*/
#include <stdio.h>
#include <stdlib.h>
typedef int status ;
//#define
typedef struct LIST{
int data;
struct LIST *next;
}listnode,*slist;
//创建链表
void CreateList(slist &L)
{
int i=1;
int a;
slist r,p; //r 指向前一个结点,P 当前结点
printf("请输入链表第%d个结点:",i);
scanf("%d",&a);
r=L;
while(a!=-1)//当a=-1时,结束建立
{
p=(slist)malloc(sizeof(listnode));
p->data=a;
r->next=p;
r=p;
i++; // 计数
printf("请输入链表第%d个结点:",i);
scanf("%d",&a);
}
r->next=NULL;
}
//打印链表
int PrintList(slist &L)
{
slist p;
p=L->next;
if(!p)
{
printf("此表已置空");
return -1;
}
while(p)
{
printf("\t%d",p->data);
p=p->next;
}
return 0;
}
//销毁链表
int DestroyList(slist &L)
{
slist q;
while(L)
{
q=L->next;
free(L);
L=q;
}
return 0;
}
//置空表
int ClearList(slist &L)
{
slist p,q;
p=L->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
return 0;
}
//取得第i元素
int GetElem(slist &L,int i,int* e)
{
int j=1;
slist p;
p=L->next;
while(p && j<i) //找到第i个结点
{
p=p->next;
j++;
}
if(i<0||!p)
return -1;
*e=p->data;
return 0;
}
//按值查找链表
int LocateList(slist &L,int a)
{
int j=1;
slist p;
p=L->next;
while(p)
{
if(p->data==a)
break;
p=p->next;
j++;
}
if(p==NULL)
{
printf("没有此元素");
return -1;
}
printf("%d",j);
return 0;
}
//插入链表
int InsertList(slist &L,int i,int e)
{
int j=0;
slist p,s;
p=L;
while(p && j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return -1;
s=(slist)malloc(sizeof(listnode));
s->data=e;
s->next=p->next;
p->next=s;
return 0;
}
//删除某一元素
int DeleteList(slist &L,int i)
{
int j=0;
slist p,q;
p=L;
while(p && j<i-1)
{
p=p->next;
j++;
}
if(!p)
return -1;
q=p->next;
p->next= q->next;
free(q);
return 0;
}
//倒置链表
int L1N_LN1(slist &L)
{
slist p,q;//p指向下一个结点,q指向当前结点
p=L->next;
L->next=NULL;
while(p)
{
//顺序不能出错
q=p; //q指向当前
p=q->next; //p指向后一个结点
q->next=L->next; //把L->next后的链表赋给q->next
L->next=q; //把当前结点q赋给L->next
}
return 0;
}
//有序链表合并
slist Merge(slist &L,slist &k)
{
slist h,r,p,q;
p=L->next;
q=k->next;
free(k);
r=L;
h=r;
while(p && q)
{
if(p->data<=q->data)//1. 赋结点给r 2. r后移一位 3. p后移一位
{
r->next=p; // 1. 赋结点给r
r=p; // 2. r后移一位
p=p->next; // 3. p后移一位
}else{
r->next=q;
r=q;
q=q->next;
}
}
if(p==NULL) //如果p指向最后,q没有完,则把q赋给r->next
p=q;
r->next=p;//否则,直接把p赋给r->next
return h;
}
int main()
{
int a;
slist H,k,r;
H=(slist)malloc(sizeof(listnode));
H->next=NULL;
k=(slist)malloc(sizeof(listnode));
k->next=NULL;
CreateList(H);
PrintList(H);
printf("\n");
CreateList(k);
PrintList(k);
r=Merge(H,k);
printf("\n");
PrintList(r);
printf("\n");
return 0;
}