資料結構實驗報告1
阿新 • • 發佈:2019-02-01
1.隨機產生或鍵盤輸入一組元素,建立一個帶頭結點的單向連結串列(無序)。
typedef int Elemtype;
typedef struct node
{
Elemtype data;
struct node *next;
} Node,*LinkList;
LinkList Createlist()//構建先進後出連結串列;
{
LinkList L,p;
L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
printf("please input the numbers :\n");
Elemtype x;
cin>> x;
while(x!=0)
{
p=(LinkList)malloc(sizeof(Node));
p->data=x;
p->next=L->next;
L->next=p;
cin>>x;
}
return L;
}
2.遍歷單向連結串列。
void put(LinkList H)//輸出連結串列裡的值
{
LinkList L=H;
LinkList q;
while(L->next!=NULL)
{
L= L->next;
q=L;
printf("%d ",q->data);
}
cout<<endl;
}
3.把單向連結串列中元素逆置(不允許申請新的結點空間)。
void nizhi(LinkList &H)//將連結串列逆置
{
LinkList L=H;
LinkList p,q;
p=L->next;
L->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next= L->next;
L->next =q;
}
}
4.在單向連結串列中刪除所有的偶數元素結點。
void deleteDE(LinkList &H)//刪除值為偶數的元素
{
LinkList L=H,q,p;
while(L->next!=NULL)
{
p=L->next;
if(p->data%2==0)
{
q=p->next;
free(p);
L->next=q;
}
else
L=L->next;
}
}
5.編寫在非遞減有序連結串列中插入一個元素使連結串列元素仍有序的函式,並利用該函式建立一個非遞減有序單向連結串列。
void insert(LinkList &H,int x)
{
LinkList L=H,p,q;
while(L->next!=NULL)
{
L=L->next;
p=L;
if(p->data<=x&&p->next->data>=x)
{
q=(LinkList)malloc(sizeof(Node));
q->data=x;
q->next=p->next;
p->next=q;
q=NULL;
break;
}
}
if(q!=NULL)
{
q=(LinkList)malloc(sizeof(Node));
q->data=x;
q->next=NULL;
L->next=q;
}
}
LinkList Createlist1(LinkList &H)//構建非遞減有序單向連結串列;
{
LinkList L,p,q=H;
L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
Elemtype x;
q=H->next;
while(q!=NULL)
{
x=q->data;
p=(LinkList)malloc(sizeof(Node));
p->data=x;
p->next=L->next;
L->next=p;
q=q->next;
}
return L;
}
6.利用演算法5建立兩個非遞減有序單向連結串列,然後合併成一個非遞增連結串列。
void hebing(LinkList &H,LinkList &L)
{
LinkList p=H;
while(p->next!=NULL)
{
p=p->next;
insert(L,p->data);
}
Createlist1(L);
nizhi(L);
}
7.利用演算法5建立兩個非遞減有序單向連結串列,然後合併成一個非遞減連結串列。
void hebing2(LinkList &H,LinkList &L)
{
LinkList p=H;
while(p->next!=NULL)
{
p=p->next;
insert(L,p->data);
}
Createlist1(L);
}
8.利用演算法1建立的連結串列,實現將其分解成兩個連結串列,其中一個全部為奇數,另一個全部為偶數(儘量利用已知的儲存空間)。
void sort4(LinkList H)//分為左右兩部分,左邊的元素為奇數,右邊所有元素為偶數
{
LinkList L=H,p,q,r,s;
r=L;
p=L->next;
int j=0;
while(p!=NULL)
{
s=p;//s為最後一個節點;
p=p->next;
j++;
}
r=L;
p=L->next;
q=p->next;
for(int i=0; i<j-1; i++)
{
if((p->data)%2==0)
{
r->next=q;
p->next=NULL;
s->next=p;
s=p;
p=q;
q=p->next;
}
else
{
r=p;
p=q;
q=p->next;
}
}
}
void fenjie(LinkList H,LinkList L)
{
LinkList q=H,p;
q=q->next;
while(q->data%2==1)
{
Elemtype x;
x=q->data;
p=(LinkList)malloc(sizeof(Node));
p->data=x;
p->next=L->next;
L->next=p;
H->next=q->next;
free(q);
q=H->next;
}
}
10.在主函式中設計一個簡單的選單,分別除錯上述演算法。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
//1.隨機產生或鍵盤輸入一組元素,建立一個帶頭結點的單向連結串列(無序)。
typedef int Elemtype;
typedef struct node
{
Elemtype data;
struct node *next;
} Node,*LinkList;
LinkList Createlist()//構建先進後出連結串列;
{
LinkList L,p;
L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
printf("please input the numbers :\n");
Elemtype x;
cin>>x;
while(x!=0)
{
p=(LinkList)malloc(sizeof(Node));
p->data=x;
p->next=L->next;
L->next=p;
cin>>x;
}
return L;
}
//2.遍歷單向連結串列。
void put(LinkList H)//輸出連結串列裡的值
{
LinkList L=H;
LinkList q;
while(L->next!=NULL)
{
L=L->next;
q=L;
printf("%d ",q->data);
}
cout<<endl;
}
//3.把單向連結串列中元素逆置(不允許申請新的結點空間)。
void nizhi(LinkList &H)//將連結串列逆置
{
LinkList L=H;
LinkList p,q;
p=L->next;
L->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=L->next;
L->next =q;
}
}
//4.在單向連結串列中刪除所有的偶數元素結點。
void deleteDE(LinkList &H)//刪除值為偶數的元素
{
LinkList L=H,q,p;
while(L->next!=NULL)
{
p=L->next;
if(p->data%2==0)
{
q=p->next;
free(p);
L->next=q;
}
else
L=L->next;
}
}
//5.編寫在非遞減有序連結串列中插入一個元素使連結串列元素仍有序的函式,並利用該函式建立一個非遞減有序單向連結串列。
void insert(LinkList &H,int x)
{
LinkList L=H,p,q;
while(L->next!=NULL)
{
L=L->next;
p=L;
if(p->data<=x&&p->next->data>=x)
{
q=(LinkList)malloc(sizeof(Node));
q->data=x;
q->next=p->next;
p->next=q;
q=NULL;
break;
}
}
if(q!=NULL)
{
q=(LinkList)malloc(sizeof(Node));
q->data=x;
q->next=NULL;
L->next=q;
}
}
LinkList Createlist1(LinkList &H)//構建非遞減有序單向連結串列;
{
LinkList L,p,q=H;
L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
Elemtype x;
q=H->next;
while(q!=NULL)
{
x=q->data;
p=(LinkList)malloc(sizeof(Node));
p->data=x;
p->next=L->next;
L->next=p;
q=q->next;
}
return L;
}
//6.利用演算法5建立兩個非遞減有序單向連結串列,然後合併成一個非遞增連結串列。
void hebing(LinkList &H,LinkList &L)
{
LinkList p=H;
while(p->next!=NULL)
{
p=p->next;
insert(L,p->data);
}
Createlist1(L);
nizhi(L);
}
//7.利用演算法5建立兩個非遞減有序單向連結串列,然後合併成一個非遞減連結串列。
void hebing2(LinkList &H,LinkList &L)
{
LinkList p=H;
while(p->next!=NULL)
{
p=p->next;
insert(L,p->data);
}
Createlist1(L);
}
//8.利用演算法1建立的連結串列,實現將其分解成兩個連結串列,其中一個全部為奇數,另一個全部為偶數(儘量利用已知的儲存空間)。
void sort4(LinkList H)//分為左右兩部分,左邊的元素為奇數,右邊所有元素為偶數
{
LinkList L=H,p,q,r,s;
r=L;
p=L->next;
int j=0;
while(p!=NULL)
{
s=p;//s為最後一個節點;
p=p->next;
j++;
}
r=L;
p=L->next;
q=p->next;
for(int i=0; i<j-1; i++)
{
if((p->data)%2==0)
{
r->next=q;
p->next=NULL;
s->next=p;
s=p;
p=q;
q=p->next;
}
else
{
r=p;
p=q;
q=p->next;
}
}
}
void fenjie(LinkList H,LinkList L)
{
LinkList q=H,p;
q=q->next;
while(q->data%2==1)
{
Elemtype x;
x=q->data;
p=(LinkList)malloc(sizeof(Node));
p->data=x;
p->next=L->next;
L->next=p;
H->next=q->next;
free(q);
q=H->next;
}
}
void freelist(LinkList H)//釋放連結串列空間
{
LinkList L=H;
LinkList q;
while(L!=NULL)
{
q=L;
L=L->next;
free(q);
}
}
void sort1(LinkList H)//交換值的排序
{
LinkList L=H,p,q;
p=L->next;
int j=0;
while(p!=NULL)
{
p=p->next;
j++;
}
for(int i=0;i<j;i++)
{
q=L->next;
for(int k=i;k<j-1;k++)
{
p=q;
q=p->next;
if(p->data > q->data)
{
int tmp;
tmp=p->data;
p->data=q->data;
q->data=tmp;
}
}
}
}
int main()
{
LinkList S=Createlist();
nizhi(S);
int x=1;
while(x)
{
getchar();
cout<<"按任意鍵繼續......"<<endl;
getchar();
system("cls");
cout<<"此時的資料為:";
put(S);
cout<<endl<<"請輸入指令:"<<endl;
cout<<"1,逆置:"<<endl;
cout<<"2,刪除偶數元素節點:"<<endl;
cout<<"3,非遞減有序連結串列中插入一元素使連結串列元素仍有序,並建立一個非遞減有序單向連結串列:"<<endl;
cout<<"4,分解成兩個連結串列,其中一個全部為奇數,另一個全部為偶數,並結束程式:"<<endl;
cin>>x;
if(x==1)
{
nizhi(S);
put(S);
}
else if(x==2)
{
deleteDE(S);
put(S);
}
else if(x==3)
{
sort1(S);
put(S);
cout<<"請輸入插入的元素:"<<endl;
int a;
cin>>a;
insert(S,a);
LinkList L=Createlist1(S);
nizhi(L);
put(L);
}
else if(x==4)
{
sort4(S);
LinkList L;
L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
fenjie(S,L);
put(S);
put(L);
freelist(L);
freelist(S);
break;
}
}
}