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其他兩題的主要函數都寫過了,如果有人看到這裏有不明白的可以私信