By ZJX
拖延症更新中
PS。这是2020 春我的数据结构作业 可以参考 可以跑 但不要完整抄作业 3Q
T17 顺序表 用一个辅助结点 ,实现向右循环k位的运算
//T17
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
struct sqList{
int num[MAXSIZE];
int last;
};
typedef struct sqList *list;
list creat()
{
int n,i=0;
list L=(list)malloc(sizeof(struct sqList));
L->last=-1;
printf("please enter List,until -1\n");
while(1)
{
scanf("%d",&n);
if(n==-1) break;
else
{
L->num[i++]=n;
L->last++;
}
}
return L;
}
list move(list L,int k)
{
int i,j,temp=0;
if(L->last==-1) printf("false list\n");
else{
for(i=0;i<k;i++)
{
for(j=L->last;j>=0;j--)
{
if(j==L->last) temp=L->num[j];
else L->num[j+1]=L->num[j];
}
L->num[0]=temp;
}
}
return L;
}
void output(list L)
{
int i;
for(i=0;i<=L->last;i++)
printf("%d ",L->num[i]);
}
int main()
{
int k;
list L=creat();
printf("please enter k\n");
scanf("%d",&k);
move(L,k);
output(L);
}
T19有序顺序表 从小到大合并
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
struct sqList{
int num[MAXSIZE];
int last;
};
typedef struct sqList *list;
list creat()
{
int n,i=0;
list L=(list)malloc(sizeof(struct sqList));
L->last=-1;
printf("please enter List,until -1\n");
while(1)
{
scanf("%d",&n);
if(n==-1) break;
else
{
L->num[i++]=n;
L->last++;
}
}
return L;
}
void output(list L)
{
int i;
for(i=0;i<=L->last;i++)
printf("%d ",L->num[i]);
}
list merge(list L1,list L2)
{
int length1=L1->last+1;
int length2=L2->last+1;
int i=0,j=0,k=0;
list L=(list)malloc(sizeof(struct sqList));
L->last=-1;
while(length1>0||length2>0)
{
if(length1>0&&length2>0)
{
if(L1->num[i]<L2->num[j])
{
L->num[k++]=L1->num[i++];
length1--;
L->last++;
}
else if(L1->num[i]>L2->num[j])
{
L->num[k++]=L2->num[j++];
length2--;
L->last++;
}
}
else if(length2==0)
{
L->num[k++]=L1->num[i++];
L->last++;
length1--;
}
else if(length1==0)
{
L->num[k++]=L2->num[j++];
L->last++;
length2--;
}
}
return L;
}
int main()
{
list L1=creat();
list L2=creat();
list L=merge(L1,L2);
output(L);
}
T21 线性表逆置,占用原空间
对于顺序表,那很easy啦
两头对换一下即可 设计函数list exchange(list L) 最终还是返回表L
对于链表——
设计一个reverse函数吧! 我采用的是头插法(一个r防止链端),,当然还有设两个指针的防止链断的,懒得写了
ps.这题一定要画图才清晰
#include<stdio.h>
#include<stdlib.h>
typedef struct node *List;
struct node
{
int data;
List next;
};
List creat()
{
int k;
List s,r,head;
List L=(List)malloc(sizeof(struct node));
L->next=NULL;
head=L;
r=L;
printf("please enter list until -1\n");
while(1)
{
scanf("%d",&k);
if(k==-1) break;
else
{
s=(List)malloc(sizeof(struct node));
s->data=k;
r->next=s;
r=s;
}
}
r->next=NULL;
return head;
}
void reverse(List L)
{
List p,r;
p=L->next;
L->next=NULL;
while(p)
{
r=p->next;
p->next=L->next;
L->next=p;
p=r;
}
}
void output(List L)
{
List p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
List L;
L=creat();
output(L);
reverse(L);
output(L);
}
T22 按整数值递增排列 将x插入表L中,使L仍然有序
我的思路:按位序扫描链表,扫到一个值比x小了,那么记录此时的指针指向,在这个位置后面插入就行了 insert(L,x,i+1) 或者不用之前已经写的insert模版,手动写一个插入,会更快
//T22 按整数值递增排列 将x插入表L中,使L仍然有序
#include<stdio.h>
#include<stdlib.h>
typedef struct node *List;
struct node
{
int data;
List next;
};
List creat()
{
int k;
List s,r,head;
List L=(List)malloc(sizeof(struct node));
L->next=NULL;
head=L;
r=L;
printf("please enter list until -1\n");
while(1)
{
scanf("%d",&k);
if(k==-1) break;
else
{
s=(List)malloc(sizeof(struct node));
s->data=k;
r->next=s;
r=s;
}
}
r->next=NULL;
return head;
}
void insert(List L,int x)//查找x要插入的位置
{
List p=L->next;
List pre=L;
List s=(List)malloc(sizeof(List));
s->data=x;
while (p&&p->data<=x)
{
pre=p;
p=p->next;
}
pre->next=s;
s->next=p;
}
void output(List L)
{
List p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
List L;
int data;
L=creat();
output(L);
printf("data=");
scanf("%d",&data);
insert(L,data);
output(L);
}
T31 三类字符构造循环链表
我的思路:造三个小链表,扫描原链表,判断数据域的类型,插入到对应的三个链表中
题目要求:利用原表中的结点空间作为这三个表的结点空间:是的,以上方法只改变了指针的指向
本来我不知道怎么构造一个有三种类型的链表
偷看了下ppt 要用Union
T27
之前两题reverse和insert的综合体 综合即可,2分钟,很简单
#include<stdio.h>
#include<stdlib.h>
typedef struct node *List;
struct node
{
int data;
List next;
};
List creat()
{
int k;
List s,r,head;
List L=(List)malloc(sizeof(struct node));
L->next=NULL;
head=L;
r=L;
printf("please enter list until -1\n");
while(1)
{
scanf("%d",&k);
if(k==-1) break;
else
{
s=(List)malloc(sizeof(struct node));
s->data=k;
r->next=s;
r=s;
}
}
r->next=NULL;
return head;
}
void reverse(List L)
{
List p,r;
p=L->next;
L->next=NULL;
while(p)
{
r=p->next;
p->next=L->next;
L->next=p;
p=r;
}
}
void insert(List L,int x)
{
List p=L->next;
List pre=L;
List s=(List)malloc(sizeof(List));
s->data=x;
while (p&&p->data>=x)
{
pre=p;
p=p->next;
}
s->next=pre->next;
pre->next=s;
}
List ReAndSort(List L1,List L2)
{
reverse(L1);
List p=L2->next;
while(p)
{
insert(L1,p->data);
p=p->next;
}
return L1;
}
void output(List L)
{
List p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
List L1,L2,p;
L1=creat();
L2=creat();
p=ReAndSort(L1,L2);
output(p);
}
试题名称 学生信息管理 时间限制: 1 秒 内存限制: 10000KB
问题描述
某班学生的信息存放在一个线性单链表中,但每学期都有学生因故退学。现要求根据退学学生的学号,将其信息从链表中删除。假设学生的数据只保存姓名、学号、性别,并采用结构体类型描述。输入说明
输入n个学生数据(1<=n<=10)。每行一个学生信息,包括:姓名(不超过20个字符的字符串)、学号(整形)、性别(字符),以空格分隔。学生数据以#结束,并在下一行输入退学学生的学号。输出说明 若链表中有退学学生,输出删除该学生后的学生数据;如果链表中没有该学生,则输出错误信息No。
输入样例 例1: LiDong 1001 M ZhaoJian 1002 M ChenKai 1003 M LiXia 1004 F
WangHong 1005 F QianLi 1006 F ZhouQiang 1007 M
#
1003例2: LiDong 1001 M ZhaoJian 1002 M ChenKai 1003 M LiXia 1004 F WangHong
1005 F QianLi 1006 F ZhouQiang 1007 M
#
1008输出样例 例1: LiDong 1001 M ZhaoJian 1002 M LiXia 1004 F WangHong 1005 F
QianLi 1006 F ZhouQiang 1007 M例2: No
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node *List;
struct node{
char name[25];
int num;
char sex;
List next;
};
List creat()
{
int number;
char se;
List L=(List)malloc(sizeof(struct node));
L->next=NULL;
List r,s,head;
head=L;
r=L;//尾指针
char names[25];
while(1)
{
scanf("%s",names);
if(names[0]=='#') break; //不是#的时候循环
else{
s=(List)malloc(sizeof(struct node));
scanf("%d %c ",&number,&se);
strcpy(s->name,names);
s->num=number;
s->sex=se;
s->next=NULL;
r->next=s;
r=s;
}
}
return head;
}
int find(List L,int x)//查找值为x
{
List p=L->next;
int t=1;
while(p!=NULL&&p->num!=x)
{
t++;
p=p->next;
}
if(p==NULL) t=-1;
return t;
}
void delete0(List L,int i)//第i位删除
{
List p=L;
List pre;
int cnt=0;
while(cnt!=i-1)
{
p=p->next;
cnt++;
}
pre=p;
pre->next=p->next->next;
}
void output(List L)
{
List p=L->next;
while(p)
{
printf("%s %d %c",p->name,p->num,p->sex);
p=p->next;
printf("\n");
}
}
int main()
{
List stu=creat();
int data,k;
scanf("%d",&data);
k=find(stu,data);
if(k==-1) printf("No");
else
{
delete0(stu,k);
output(stu);
}
}
OJ其他两题的主要函数都写过了,如果有人看到这里有不明白的可以私信