考研日记 | 数据结构基础代码练习

1、在带头结点的单链表L中删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一

typedef struct LNode{
  int data;
  struct LNode *next;
}*LinkList;
void Del(LinkList &L,int x){
LNode *a=L,*b=L->next;
while(b!=NULL){
if(b->data==x){
a->next=b->next;
free(b);
b=a->next;
}
else{
b=b->next;
a=a->next;
}
}

2、将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。

typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
SqList Merge(SqList L1,SqList L2){
SqList L3;
int i=0,j=0,x=0,size=L1.length+L2.length-2;
while(i<L1.length&j<L2.length){
if(L1.data[i]<=L2.data[j]){
L3.data[x]=L1.data[i];
i++;
}
else{
L3.data[x]=L2.data[j];
j++
}//if
x++;
}//while
while(i<L1.length){ //考虑两个表不等长的情况
L3.data[x]=L1.data[i];
i++;
x++;
}//while	
while(j<L2.length){
L3.data[x]=L2.data[j];
j++;
x++;
}//while
return L3;
}//Merge

3、设计一个算法,将顺序表L的所有元素逆置要求空间复杂度为O(1)

typedef struct{
 Elementype data[MaxSize];
int length;
}SqList;
void Reverse(SqList &L)
int l=L.length;
Elementype x;	
int i=0,j=l-1;
while(l>1){
x=L[i];
L[i]=L[j];
L[j]=x;
l=l-2;
i++;
j--;
}

4、从有序顺序表中删除所有值重复的元素,使表中所有元素的值均不同。

typedef struct {
Elementype data[MaxSize];
int length;
}SqList;
void Delre(SqList &L){
int i=0,j=1;
while(j!=L.length){
if(L.data[i]==L.data[j]){
L.data[j]==NULL;
j++;
}
i=j;
j++;
}
int a=0,b=0;
for(int i=0;i<L.length;i++){
if(L.[i]==NULL){
b++;
}else{
L.[a]=L.[i];
a++;}
L.length=L.length-b;
}

5、已知在一维数组A[m+n]中依次存放两个线性表{a1,a2,a3,…,am}和{b1,b2,b3…,bn}。试编写一个函数,将数组中两个顺序表中的位置互换,即将{b1,b2,b3…bn}放在{a1,a2,a3,…,am}的前面

typedef struct{
Elementype data[MAXSIZE];
int length;
}SqList;
void Swap(SqList &L,int m,int n,int l){
int i=m,j=n;
Elementype x;
while(i!=(l/2+1)){
x=L.data[i];
L.data[i]=L.data[j];
L.data[j]=x;
i++;
j--;
} //while
}//Swap
int main(){
SqList L;
Initial(L);//初始化
Swap(L,1,m,m);
Swap(L,m+1,m+n,n);
Swap(L,1,m+n,m+n);
}

6、头插法建立单链表

typedef struct{
Elementype data;
struct LNode *next;
}LNode,*LinkList;
LinkList Head_Insert(LinkList &L){
LNode *p;//先创建结构类型指针
L=(LinkList)malloc(sizeof(LNode));
Elementype x;
scanf(“%d”,&x);
while(x!=NULL){//NULL代表结束值,结束值为几就是几
p=(LNode*)malloc(sizeof(LinkList));
p->data=x; p->next=L->next; L->next=p;
scanf(“%d”,&x);
}//while
return L;
}//Head_Insert

7、尾插法建立

LinkList End_Insert(LinkList &L){
LNode *p,*e=L;
Elementype x;
L=(LinkList)malloc(sizeof(LNode));
scanf(“%d”,&x);
while(x!=NULL){//NULL代表结束值,结束值为几就是几
p=(LNode*)malloc(sizeof(LinkList));
p->data=x; e->next=p; p->next=NULL; e=e->next;
scanf(“%d”,&d);
}//while
return L;
}//End_Insert

8、将带头结点的单链表原地逆置,空间复杂度为O(1)

typedef struct{
Elementype data;
struct LNode *next;
}LNode,*LinkList;
bool Invert(LinkList &L){
if(L==NULL)
return fasle;
LNode *a=L->next,*b=a->next,*p=a;
a->next=NULL; b=b->next; a=b;
while(a!=NULL){
a->next=p; p=a; a=b; b=b->next;
}//while
L->next=p;
return L;
}//Invert
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值