1;程序;线性表ab为按元素递增有序排列的;
程序目的;合并ab在原链表结构上,并然保持递增序列;没有相同值节点,在a链表的基础上。
2; 原地倒置;传递指向头节点的指针
/*
程序;线性表ab为按元素递增有序排列的;
程序目的;合并ab在原链表结构上,并然保持递增序列;没有相同值节点
在a链表的基础上。
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int elem;
struct node*next;
}Node;
void Creat_lb(Node * s, int m);
void Print_lb(const Node *s);
void marge_lb(Node *a, Node *b);
int main()
{
Node a,b;
int num_a,num_b;
printf("请输入链表a的项数\n");
scanf("%d",&num_a);
Creat_lb(&a,num_a);
//Print_lb(&a);
printf("请输入链表b的项数\n");
scanf("%d",&num_b);
Creat_lb(&b,num_b);
printf("输出链表a并b\n");
marge_lb(&a,&b);
Print_lb(&a);
return 0;
}
void marge_lb(Node *a, Node *b)
{
Node * pa, *pb, *pc, *pb1=NULL;
pa = a->next;
pb = b->next;
pc = a;//在a链表的基础上修改
while(pa != NULL && pb != NULL){
if(pa->elem < pb->elem){
pc->next = pa;
pc = pa;
pa = pa->next;
}
else if(pa->elem > pb->elem){
pc->next = pb;
pc = pb;
pb = pb->next;
}
else{
pc->next = pa;
pc = pa;
pa = pa->next;
pb1 = pb;
pb = pb->next;
free(pb1);//将这个节点内存释放。
}
}
if(pa == NULL){
while(pb != NULL){
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
else{
while(pa != NULL){
pc->next = pa;
pc = pa;
pa = pa->next;
}
}
}
void Creat_lb(Node * s, int m)
{
Node *p, *q;
q = s;
for(int i = 0; i < m; i++){
p = (Node *)malloc(sizeof(Node));
scanf("%d",&p->elem);
p->next = NULL;
q->next = p;
q = p;
}
}
void Print_lb(const Node *s)
{
Node * p;
p = s->next;
while(p!=NULL){
printf("%d ",p->elem);
p = p->next;
}
}
/*
程序;链表的就地逆置
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int elem;
struct node* next;
}Node;
void Creat_lb(Node *s,int m);
void Print_lb(const Node *s);
void Inversion_lb(Node * s);
int main()
{
Node a;
Creat_lb(&a,4);
Inversion_lb(&a);
Print_lb(&a);
return 0;
}
/*
原地倒置;传递指向头节点的指针
1;思想就是头插法思想,
2;注意要先将一个节点插入(将第二个节点插入第一个节点和头结点之间)
之后的指向就是。q依然指向头结点。p1指向第二个节点,p指向第三个节点(也就是下次即将插入的节点)
其余节点则可以使用while循环;
3;
*/
void Inversion_lb(Node * s)
{
Node * p, *q, *p1;
q = s;//q始终是指向头结点的。
p = s->next;//p为插入前节点的前一个节点;
if(p->next == NULL){
return ;
}
q->next = p;//先插入一个节点
p1 = p->next;
p->next = NULL;//这就是最后一个节点要使得next=NULL;
p = p1->next;
p1->next = q->next;
q->next = p1;
while(p!=NULL){
p1 = p;//p1指向的是要插入的节点
p = p->next;//p指向的是下一个要插入的节点
p1->next = q->next;//插入的两个步骤,1.这个节点与后面链表的链接
q->next = p1;//这个节点与头结点的链接;
}
}
void Creat_lb(Node *s,int m)
{
Node *p,*q;
p = s;
for(int i = 0; i < m; i++){
q = (Node *)malloc(sizeof(Node));
scanf("%d",&q->elem);
q->next = NULL;
p->next = q;
p = q;
}
}
void Print_lb(const Node *s)
{
Node * p;
p = s->next;
while(p != NULL){
printf("%d ",p->elem);
p = p->next;
}
}