链表的一些基础题
发布日期:2021-06-29 11:11:38 浏览次数:2 分类:技术文章

本文共 3127 字,大约阅读时间需要 10 分钟。

1;程序;线性表ab为按元素递增有序排列的;

程序目的;合并ab在原链表结构上,并然保持递增序列;没有相同值节点,在a链表的基础上。
2; 原地倒置;传递指向头节点的指针

/*    程序;线性表ab为按元素递增有序排列的;        程序目的;合并ab在原链表结构上,并然保持递增序列;没有相同值节点        在a链表的基础上。*/#include
#include
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
#include
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; }}

转载地址:https://blog.csdn.net/zw1996/article/details/54693222 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c语言数据结构——三元数组的快速转置
下一篇:安卓布局——注册页面

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月20日 18时18分03秒