考研数据结构目录
1、顺序表(链表操作)
2、堆栈与队列
后续将持续更新~
前言:首先这四个题都是考研真题,不要觉得它就难了,很有锻炼思维的作用,自我感觉都是很基础的,而且最重要的一点是如何处理这一类问题是有固定方法的。
这四个题可以说也是固定思想套路,都是建立一个新的链表进行辅助操作,在考研中算是比较公认的一种处理方法了,小伙伴们平常做题也可以使用。
补充:有些小伙伴可能说会说,“我还有更好的方法或者更简洁的代码”,当然肯定会出现这种情况,我也并不反对,但是你的代码是给阅卷老师看的,这种新建链表的方法往往结构会更清晰。
建议:这些题小伙伴们可以先自己独立思考一下,建议先在脑子里有自己的动态想法
目录
1、倒置链表
//倒置链表
void reverse(NODE * head){ //方法:建议一个新的节点专门存
//注意:这里给出的head没有头节点滴
NODE * head_a,*p,*s;
head_a=(NODE*)malloc(sizeof(NODE));
head_a->next=NULL;
s=head_a;
p=head;
while(p){//或者head->next
head=p->next;//1、孤立结点
p->next=s->next;//2、插到新节点后面
s->next=p;
p=head; // 3、返回p指针
}
head=s->next;//4、把head和head_a对接
printLink(head);
}
2、合并有序链表
//合并有序链表
void merge(NODE * head_a,NODE * head_b){
NODE * head_c,*p1,*p2,*s;
head_c=(NODE*)malloc(sizeof(NODE));
head_c->next=NULL;
s=head_c;p1=head_a;p2=head_b;
while(p1&&p2){
if(p1->data<p2->data){//p小,先排head_a链表
head_a=p1->next;//孤立
p1->next=s->next;
s->next=p1;
s=p1;
p1=head_a;
}else{
head_b=p2->next;
p2->next=s->next;
s->next=p2;
s=p2;
p2=head_b;
}
if(p1){
s->next=p1;
}else{
s->next=p2;
}
}
printLink(head_c);
}
3、将链表中所有负数结点移动到所有整数之前
//把负数移动到所有整数之前
void move(NODE * head){
//初始化
NODE * head_a,*p,*q,*s;
head_a=(NODE*)malloc(sizeof(NODE));
s=head_a;head_a->next=NULL;
//为便于操作 给它原始链表加一个头节点
p= (NODE*)malloc(sizeof(NODE));
p->next=head;head=p;
//进入正题
while(p->next){
if(p->next->data<0){
q=p->next;
p->next=q->next;//最后q(也就是负数节点)被孤立出来
q->next=s->next;
s->next=q;
s=q;
}else{
p=p->next;
}
}
//最后把head_a上所有的负数节点加到原链表上
q->next=head->next;//最后是q在head_a的尾部
free(head);//把原来多余的头节点释放掉
head_a=head_a->next;//把新建的头结点孤立掉
printLink(head_a);
}
4、将最小节点移动到第一个节点的前面
//把最小节点移动到第一个节点的前面
void moveMin(NODE * head){
NODE *p,*q,*s;
//为原来节点加一个头结点
p=(NODE*)malloc(sizeof(NODE));
p->next=head;
head=p;
//进入正题
p=head; q=head->next;
while(q->next){
if(q->next->data<p->next->data){
p=q;
}
q=q->next;
}
//最后p为最小值的 前一个节点
s=p->next;//s就是最小值的节点
p->next=s->next;//孤立s节点
s->next=head->next;
head->next=s;
head=head->next;//删除head头结点
printLink(head);
}
5、完整运行代码
#include<stdio.h>
typedef struct node{
int data;
struct node * next;
}NODE;
//打印节点
void printLink(NODE * head){//打印结点
NODE * p;
p=head;
while(p->next){
printf("%2d ",p->data);
p=p->next;
}
printf("%d\n",p->data);//上面那个循环不会打印最后一个,把最后一个也打印
}
//创建节点
NODE * creat(){
NODE * head,*p,*s;
head=(NODE*)malloc(sizeof(NODE));
p=head;
head->next=NULL;
int flag=-1;
for(int i=1;i<=6;i++){//创建一个顺序链表
s=(NODE*)malloc(sizeof(NODE));
s->data=flag*i;
s->next=p->next;
p->next=s;
p=s;
flag=-flag;
}
if(head->next)//把头节点摘掉
head=head->next;
printLink(head);
return head;
}
//倒置链表
void reverse(NODE * head){ //方法:建议一个新的节点专门存
//注意:这里给出的head没有头节点滴
NODE * head_a,*p,*s;
head_a=(NODE*)malloc(sizeof(NODE));
head_a->next=NULL;
s=head_a;
p=head;
while(p){//或者head->next
head=p->next;//1、孤立结点
p->next=s->next;//2、插到新节点后面
s->next=p;
p=head; // 3、返回p指针
}
head=s->next;//4、把head和head_a对接
printLink(head);
}
//合并有序链表
void merge(NODE * head_a,NODE * head_b){
NODE * head_c,*p1,*p2,*s;
head_c=(NODE*)malloc(sizeof(NODE));
head_c->next=NULL;
s=head_c;p1=head_a;p2=head_b;
while(p1&&p2){
if(p1->data<p2->data){//p小,先排head_a链表
head_a=p1->next;//孤立
p1->next=s->next;
s->next=p1;
s=p1;
p1=head_a;
}else{
head_b=p2->next;
p2->next=s->next;
s->next=p2;
s=p2;
p2=head_b;
}
if(p1){
s->next=p1;
}else{
s->next=p2;
}
}
printLink(head_c);
}
//把负数移动到所有整数之前
void move(NODE * head){
//初始化
NODE * head_a,*p,*q,*s;
head_a=(NODE*)malloc(sizeof(NODE));
s=head_a;head_a->next=NULL;
//为便于操作 给它原始链表加一个头节点
p= (NODE*)malloc(sizeof(NODE));
p->next=head;head=p;
//进入正题
while(p->next){
if(p->next->data<0){
q=p->next;
p->next=q->next;//最后q(也就是负数节点)被孤立出来
q->next=s->next;
s->next=q;
s=q;
}else{
p=p->next;
}
}
//最后把head_a上所有的负数节点加到原链表上
q->next=head->next;//最后是q在head_a的尾部
free(head);//把原来多余的头节点释放掉
head_a=head_a->next;//把新建的头结点孤立掉
printLink(head_a);
}
//把最小节点移动到第一个节点的前面
void moveMin(NODE * head){
NODE *p,*q,*s;
//为原来节点加一个头结点
p=(NODE*)malloc(sizeof(NODE));
p->next=head;
head=p;
//进入正题
p=head; q=head->next;
while(q->next){
if(q->next->data<p->next->data){
p=q;
}
q=q->next;
}
//最后p为最小值的 前一个节点
s=p->next;//s就是最小值的节点
p->next=s->next;//孤立s节点
s->next=head->next;
head->next=s;
head=head->next;//删除head头结点
printLink(head);
}
int main(){
NODE * head,*p,*s;
head=creat();
// reverse(head);
move(head);
}