typedef struct node
{
int num;
struct node *next;
}link;
void create(link *head)
{
link *p,*q; //p is current node,q is new node
p=head;
int i;
for(i=0;i<5;i++)
{
printf(" the add node %d:\n",i);
q=(link *)malloc(sizeof(link));
p->next=q;
p=q;
p->next = NULL; // add the tail is NULL;
}
p=head->next;
i = 0;
while(p!=NULL)
{
printf("enter the num %d:\n",i);
//scanf("%d",&(p->num));
p->num = rand()%100;
p=p->next;
i++;
}
}
/*
拿一个指针指向拍好序的链表,一个指向老链表的指针,一个是在新链表里面移动指针
*/
void sort(link *head)
{
link *p,*q,*r,*u;
p=head->next;
head->next=NULL;
while(p)
{
r = head;
q = head->next;
while(q&&q->num <= p->num)
{
r=q;
q=q->next;
}
u = p->next;
p->next = r->next;
r->next=p;
p=u;
}
}
link *merge(link *a,link*b)
{
link *p, *q,*pc;
p=a->next; //a链表的头指针
q=b->next; //b链表的头指针
link *c=(link*)malloc(sizeof(link));
pc=c; //c链表的头指针,pc为变化的指针,头指针不变化
while(p&&q) //a 和b不能有一个是空
{
printf("p->num:%d;q->num:%d\n",p->num , q->num);
//变化位置,
if(p->num<=q->num) //
{
pc->next=p;
pc=pc->next;
if(p->num == q->num)
{
q=q->next;
continue;
}
p=p->next;
}
else
{
pc->next=q;
pc=pc->next;
q=q->next;
}
}
pc->next=p?p:q;
free(b);
return c;
}
// 该题的思路是换了一下头 原来为head-->node1--->node2--->node3
//turn to tail<---node1<---node2<---node3,直接返回了尾部即可
link * reverseList(link *a){
//定义三个指针,保存原来的连接的状态
//当前结点指针
link *pnow = a; //新链表的头指针
//当前结点的前驱指针,初始化是 NULL
link *pre = NULL;
//当前结点的后继指针,初始化也是 null
link *pnext = NULL;
//定义尾指针
link *tail = NULL;
//开始遍历链表
while(pnow != NULL)
{
//如果当前结点不是 null,那么初始化 pnext 指针指向当前结点的下一个结点
pnext = pnow->next;
if(NULL == pnext)
{
tail = pnow; //如果找到了尾结点,初始化 tail 指针为头指针
}
//进行链表的反转,当前结点的 next 指针指向前一个结点,实现链表方向的反转,此时发生了断链
pnow->next = pre;
//勿忘断链的情形,需要使用 pre 指针保存状态,pre 等价于是后移一个结点
pre = pnow;
pnow = pnext; //pnow 后移一个结点
if(pre&&pnow&&pnext)
printf("pnow->num:%d,pre->num:%d,pnext->num:%d\n",pnow->num,pre->num,pnext->num);
printf("\n");
}
return tail;
}
int process_linklist()
{
link * a,*b,*c;
link *pa,*pb,*pc;
a=(link*)malloc(sizeof(link)); //链表A head
b=(link*)malloc(sizeof(link)); //链表B head
printf("create a\n");
create(a);
printf("creat is ok;\n");
sort(a);
pa=a->next;
printf("sort a is;\n");
while(pa)
{
printf("%d ",pa->num);
pa=pa->next;
}
printf("\n");
printf("create b\n");
create(b);
sort(b);
pb=b->next;
printf("sort b is;\n");
while(pb)
{
printf("%d ",pb->num);
pb=pb->next;
}
printf("\n");
printf("begin to merge C\n");
c=merge(a,b);
pc=c->next; //pc is head nodelist
printf("merge is:");
while(pc)
{
printf("%d ",pc->num);
pc=pc->next;
}
printf("\n");
printf("begin to reverse:\n");
c = reverseList(c);
printf("reverse linklist is;\n");
while(c)
{
printf("%d ",c->num);
c=c->next;
}
printf("\n");
return 0;
}
int main()
{
process_linklist();
system("pasue");
}
链表的处理
最新推荐文章于 2023-03-17 19:38:34 发布