计算机考研数据结构--链表部分

计算机考研数据结构–链表部分

1、顺序表中删除第i个元素;
#include <stdlib.h>
#include <stdio.h>

typedef struct SeqList{
int *arr;
int arr_length;
}SeqList;
int main(){
int arr[10]={1,2,3,4,5,6,7,8,9,10};

SeqList l;
l.arr=arr;//l.arr=arr[10];不对!!
l.arr_length=10;//赋值要全,别丢长度

int i;
scanf("%d",&i);
for(i;i<l.arr_length;i++){
	l.arr[i-1]=l.arr[i];
}

for(i=0;i<l.arr_length-1;i++){
	printf("%d",l.arr[i]);
}
return 0;

}
2、在第i个元素前面插入e
#include <stdlib.h>
#include <stdio.h>

typedef struct SeqList{
int *arr;
int arr_length;
}SeqList;
int main(){
int arr[10]={1,2,3,4,5,6,7,8,9,10};

SeqList l;
l.arr=arr;
l.arr_length=10;

int index,e;
scanf("%d%d",&index,&e);
int i;
for(i=l.arr_length-1;i>=index-1;i--){
	l.arr[i+1]=l.arr[i];
}
l.arr[index-1]=e;
l.arr_length++;
for(i=0;i<l.arr_length;i++){
	printf("%d",l.arr[i]);
}
return 0;

}
或者
#include <stdlib.h>
#include <stdio.h>

typedef struct SeqList{
int *arr;
int arr_length;
}SeqList;

void inset(SeqList *a,int index,int e){
int i;
for(i=a->arr_length-1;i>=index-1;i–){
a->arr[i+1]=a->arr[i];
}
a->arr[index-1]=e;
a->arr_length++;
}
int main(){
int arr[10]={1,2,3,4,5,6,7,8,9,10};

SeqList l;
l.arr=arr;
l.arr_length=10;

int index,e,i;
scanf("%d%d",&index,&e);
inset(&l,index,e);
for(i=0;i<l.arr_length;i++){
	printf("%d",l.arr[i]);
}
return 0;

}
3、从顺序表中删除最小元素,空出的位置有最后一个元素填补
#include <stdlib.h>
#include <stdio.h>

typedef struct SeqList{
int *arr;
int arr_length;
}SeqList;

void delete(SeqList *a){
int i;
int min_index=0;//用来记录最小的位置
for(i=1;iarr_length-1;i++){//查找最小元素的位置
if(a->arr[i]arr[min_index]){
min_index=i;
}
}
a->arr[min_index]=a->arr[a->arr_length-1];
a->arr_length–;
}
int main(){
int arr[10]={1,2,3,4,5,6,7,8,9,10};

SeqList l;
l.arr=arr;
l.arr_length=10;
int i;
delete(&l);
for(i=0;i<l.arr_length;i++){
	printf("%d",l.arr[i]);
}
return 0;

}
4、在无序顺序表中删除值在s和t之间的所有元素
如果s和t是下标
#include <stdlib.h>
#include <stdio.h>

typedef struct SeqList{
int *arr;
int arr_length;
}SeqList;

void delete(SeqList *a,int start,int end){
int i;
int distance=end-start-1;
for(i=start;iarr_length-distance;i++){
a->arr[i]=a->arr[end-1];
end++;
}
a->arr_length-=distance;
}
int main(){
int arr[10]={1,2,3,4,5,6,7,8,9,10};

SeqList l;
l.arr=arr;
l.arr_length=10;
int i,start,end;
scanf("%d%d",&start,&end);
delete(&l,start,end);
for(i=0;i<l.arr_length;i++){
	printf("%d",l.arr[i]);
}
return 0;

}
如果是指顺序表中的值无序
#include <stdlib.h>
#include <stdio.h>
//有序顺序表
typedef struct SeqList{
int *arr;
int arr_length;
}SeqList;

void delete(SeqList *a,int start,int end){
int i;
int index;
int len=a->arr_length;
for(i=0;iarr_length;i++){
if(a->arr[i]<end&&a->arr[i]>start){
index=i;
int j;
for(j=index;jarr_length-1;j++){
a->arr[j]=a->arr[j+1];
}
a->arr_length–;
i–;
}
}
}
int main(){
int arr[10]={1,4,0,2,5,9,8,3,10,7};

SeqList l;
l.arr=arr;
l.arr_length=10;
int i,start,end;
scanf("%d%d",&start,&end);
delete(&l,start,end);
for(i=0;i<l.arr_length;i++){
	printf("%d",l.arr[i]);
}
return 0;

}
5、在有序顺序表中删除值在s和t之间的所有元素
#include <stdlib.h>
#include <stdio.h>
//有序顺序表
typedef struct SeqList{
int *arr;
int arr_length;
}SeqList;

void delete(SeqList *a,int start,int end){
int i;
int start_index;
int end_index;
for(i=0;iarr_length;i++){
if(a->arr[i]==start){
start_index=i;
}
if(a->arr[i]==end){
end_index=i;
}
}

int distance=end_index-start_index-1;
for(i=start_index+1;i<a->arr_length-distance;i++){
	a->arr[i]=a->arr[end_index];
	end_index++; 
}
a->arr_length-=distance;

}
int main(){
int arr[10]={1,2,3,4,5,6,7,8,9,10};

SeqList l;
l.arr=arr;
l.arr_length=10;
int i,start,end;
scanf("%d%d",&start,&end);
delete(&l,start,end);
for(i=0;i<l.arr_length;i++){
	printf("%d",l.arr[i]);
}
return 0;

}
6、单链表访问第i个元素
#include <stdio.h>
#include <stdlib.h>

typedef struct LNode{
int data;
struct LNode *next;
}LNode;

void createList(LNode *p,int a[],int n){
LNode *s;
int i;
for(i=0;i<n;i++){
s=(LNode *)malloc(sizeof(LNode));
s->data=a[i];
s->next=p->next;
p->next=s;
}
}
void find(LNode *p,int index,int *a){
LNode *s=p->next;
int cnt=1;
while(s!=NULL){
if(cnt==index){
*a=s->data;
break;
}
cnt++;
s=s->next;
}
}
void print(LNode *p){
LNode *q=p->next;
while(q!=NULL){
printf("%d",q->data);
q=q->next;
}
printf("\n");
}
int main(){
LNode *p;
p=(LNode *)malloc(sizeof(LNode));
p->next=NULL;
int a[10]={1,2,3,4,5,6,7,8,9,10};
createList(p,a,10);
print§;
int e;
int index;
scanf("%d",&index);
find(p,index,&e);
printf("%d",e);
return 0;
}
7、在第i个位置前插入元素e(用的一个程序)
void inset(LNode *p,int index,int e){
LNode *s,*r;
s=(LNode *)malloc(sizeof(LNode));
s->next=NULL;
s->data=e;

int cnt=1;
r=p->next;
while(r!=NULL){
	if(cnt==index-1){
		s->next=r->next;
		r->next=s;
		break;
	}
	cnt++;
	r=r->next;
} 

}
8、单链表删除第i个元素,用e返回
int delete(LNode *p,int index){
int e;
LNode *s=p->next;
int cnt=1;
while(s!=NULL){
if(cnt==index-1){
e=s->next->data;
LNode *u=s->next;
s->next=s->next->next;
free(u);
return e;
break;
}
cnt++;
s=s->next;
}
}
9、头插法和尾插法
#include<stdio.h>
#include<stdlib.h>

typedef struct LNode{
int data;//单链表中的数据域
struct LNode *next;//单链表中的指针域
}LNode;
//头插法
void createList1(LNode *p,int a[],int n){
int i=0;
for(i=0;i<n;i++){
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=a[i];
s->next=p->next;
p->next=s;

}

}

//头插法 **的情况,createList2(&p,a,5);
void createList1(LNode **p,int a[],int n){
int i=0;
for(i=0;i<n;i++){
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=a[i];
s->next=(*p)->next;
(*p)->next=s;

}

}

void print(LNode *p){
LNode *s=p->next;
while(s!=NULL){
printf("%d",s->data);
s=s->next;
}
printf("\n");
}
//尾插法
void createList2(LNode *p,int a[],int n){
LNode *s;
int i=0;
for(i=0;i<n;i++){
s=(LNode *)malloc(sizeof(LNode));
s->data=a[i];
p->next=s;
p=p->next;//勿忘!!!
}
p->next=NULL;
}
int main(){
LNode *p;
p=(LNode *)malloc(sizeof(LNode));//申请节点空间
p->next=NULL;//一定不要忘记!!!// 将next设置为NULL
int a[5]={1,2,3,4,5};
createList2(p,a,5);
print§;
return 0;

}
10、la和lb按值非递减,归并la和lb,得到新的单链表lc,使得lc也按值非递减,并占用原来的空间
void guibing(LNode *la,LNode *lb){
LNode *p=la->next;
LNode *q=lb->next;

LNode *a=la;//将a作为新链表的头节点

a->next=NULL;
//两个链表从头开始往后找插入节点,直到其中 一个所有节点插入完结束
while(p!=NULL&&q!=NULL){
//两个节点比较,选出最小者插入,并且移动到后一个节点
if(p->data<=q->data){
a->next=p;
a=a->next;//!!!
p=p->next;
}
if(p->data>q->data){
a->next=q;
a=a->next;
q=q->next;
}
}
//两个链表中有一个遍历完了,剩下的链表直接插入到a中就好
if(p!=NULL){
a->next=p;
}
if(q!=NULL){
a->next=q;
}
free(lb);//释放lb
}
11、通过一趟遍历,确定链表中值最大的节点(在第九题基础上)
返回最大值
int find_Max(LNode *p){
LNode *s=p->next;
int max=0;
while(s!=NULL){
if(maxdata){
max=s->data;
}
s=s->next;
}

return max;

}
返回最大的节点
//返回最大的节点
LNode *max_LNode(LNode *p){
LNode *s=p->next;
// LNode *max=p->next;//是对的
LNode *max=s;//LNode *max=p;是不对的,他此时指向的为空

while(s!=NULL){
	if(max->data<s->data){
		max=s;
	}
	s=s->next;
}
return max;

}

void printt(LNode *p){
LNode *s=p;//节点的输出不能用LNode *s=p->next;!!!!可以说是没有头结点
while(s!=NULL){
printf("%d",s->data);
s=s->next;
}
printf("\n");
}

12、将链表中值最小的节点移动到链表的最前面
void findMinn(LNode *p){
LNode *s=p->next;
LNode *min=s;
LNode *pre=p;//指向最小值的前驱结点
LNode *t=p;//实时追踪当前指向的前驱结点
while(s!=NULL){
if(min->data>s->data){
min=s;
pre=t;//当最小的结点更换时,前驱结点 也需要更换
}
t=s;//在s指针向后移动之前,指向它,即为后驱结点的前驱结点
s=s->next;
}
pre->next=pre->next->next;//从链表中删除结点
min->next=p->next;//将最小的结点插入到头节点后面
p->next=min;
}
13、对链表使用冒泡排序
方法一:自己的方法(没有考虑排序完成就结束)
void findMinn(LNode *p){
LNode *s=p->next;
LNode *r=p->next;
int temp=s->data;
while(r!=NULL){//一次是无法完成的
while(s->next!=NULL){
if(s->data>s->next->data){
temp=s->data;
s->data=s->next->data;
s->next->data=temp;
}
s=s->next;
}

	r=r->next;
	s=p->next;
}

}

标准答案:
//要判断一趟排序是否发生交换
void find(LNode *p){
LNode *s=p->next;
LNode *q=s->next;
int temp=0;
while(1){//如果为五个数,最多拍列四次,但是其实不用判断次数,上一个程序就判断了,通过移动指针,控制排列,但是控制的却是五次,是不符合逻辑的,就通过是否排序完成来进行判断
int flag=0;//一定要放在每次循环的里面
while(q!=NULL){
if(s->data>q->data){
temp=q->data;
q->data=s->data;
s->data=temp;
flag=1;
}
s=q;
q=q->next;
}
if(flag0){
return;
}
s=p->next;//一定不要忘记将指针指回前面
q=s->next;
}
}
14、有序链表中去掉值相同的元素
void find(LNode *p){
LNode *s=p->next;
LNode *r;
while(s->next!=NULL){//一定还要判断下一个指针是否为空!!!
//如果此指针和下一个数据域相同
if(s->data
s->next->data){
r=s->next;
s->next=s->next->next;

	} 
	s=s->next;

free®;//free一定要放在后面!!
}
}(错误!!!!!)

void findMinn(LNode *p){
LNode *s=p->next;
LNode *r;
if(sNULL||s->nextNULL){//如果此链表为空或者只有一个结点时,不用进行查找比较
return;
}
while(s->next!=NULL){
//如果此指针和下一个数据域相同
if(s->data==s->next->data){
r=s->next;

		 s->next=s->next->next;
		 free(r);
	}else{
		s=s->next;
	} 	
}

}

定义两个指针的情况
void findMinn(LNode *p){
LNode *s=p->next;
LNode *q=s->next;
LNode *r;
if(sNULL||qNULL){//如果此链表为空或者只有一个结点时,不用进行查找比较
return;
}
while(q!=NULL){
//如果此指针和下一个数据域相同
if(s->data==q->data){
r=q;
// printf("%d",r->data);
s->next=q->next;
q=q->next;
free®;//不能在q指向前就释放!!
}else{
s=s->next;
q=q->next;
}
}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值