一、實驗目的
(1)掌握線性表的基本運算在兩種儲存結構(順序結構和鏈式結構)上的實現;
(2)掌握線性表的各種操作(建立、插入、刪除等)的實現演算法; 二、實驗儀器及環境:
PC電腦 windows 7作業系統 CodeBlocks10.05 三、實驗內容及結果(按照具體實驗題目,按照如下格式書寫)
1.隨機產生或鍵盤輸入一組元素,建立一個帶頭結點的單向鏈表(無序)。
2.遍曆單向鏈表。
3.把單向鏈表中元素逆置(不允許申請新的結點空間)。
4.在單向鏈表中刪除所有的偶數元素結點。
5.編寫在非遞減有序鏈表中插入一個元素使鏈表元素仍有序的函數,並利用該函數建立一個非遞減有序單向鏈表。
6.利用演算法5建立兩個非遞減有序單向鏈表,然後合并成一個非遞增鏈表。
7.利用演算法5建立兩個非遞減有序單向鏈表,然後合并成一個非遞減鏈表。
8.利用演算法1建立的鏈表,實現將其分解成兩個鏈表,其中一個全部為奇數,另一個全部為偶數(盡量利用已知的儲存空間)。
10.在主函數中設計一個簡單的菜單,分別調試上述演算法。
#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>#define MAXASIZE 100typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next;} LNode,*LinkList;using namespace std;//1.隨機產生或鍵盤輸入一組元素,建立一個帶頭結點的單向鏈表(無序)。LinkList creat()//建立一個帶前端節點的鏈表{ printf("Please Input a List of Numbers: "); LinkList p1,p2,head; head=(LNode *)malloc(sizeof(LNode)); head->next=NULL; p1=head; ElemType x; while(scanf("%d",&x)!=-1) { p2=(LNode *)malloc(sizeof(LNode)); p2->data=x; p1->next=p2; p1=p2; } p1->next=NULL; return head;}//2.遍曆單向鏈表。void display(LinkList head)//遍曆{ LinkList p; p=head->next; printf("HEAD -> "); while(p!=NULL) { printf("%d -> ",p->data); p=p->next; } printf("TAIL\n");}void InsertList(LinkList head,ElemType x)//插入x{ //printf("Please Input the Location and the Number which You Want to Insert: "); LinkList l=head,p1,p2; l=head; bool flag=0; if (l->next->data>x)//隊首 { p2=(LNode *)malloc(sizeof(LNode)); p2->data=x; p2->next=l->next; l->next=p2; return; } while(l->next) { l=l->next; p1=l; //flag=0;//flag=0表示尚未插入 if (p1->data<=x && p1->next->data>=x)//插入在p1與p1->next中間 { p2=(LNode *)malloc(sizeof(LNode)); p2->data=x; p2->next=p1->next; p1->next=p2; flag=1;//已插入 break; } } if (!flag) { p2=(LNode *)malloc(sizeof(LNode)); p2->data=x; p2->next=NULL; l->next=p2; }}LinkList CreateNew(LinkList head)//構建非遞減有序單向鏈表;{ LinkList l,p1,p2=head; l=(LNode *)malloc(sizeof(LNode)); l->next=NULL; ElemType x; p2=head->next; while(p2) { x=p2->data; p1=(LNode *)malloc(sizeof(LNode)); p1->data=x; p1->next=l->next; l->next=p1; p2=p2->next; } return l;}//3.把單向鏈表中元素逆置(不允許申請新的結點空間)。LinkList ReverseList(LinkList head)//逆置鏈表{ LinkList p1,p2; if (head->next==NULL) return head; p1=head->next; head->next=NULL; while(p1) { p2=p1; p1=p1->next; p2->next=head->next; head->next=p2; } return head;}ElemType LengthList(LinkList head){ LinkList p; p=head->next; int num=0; while(p!=NULL) { p=p->next; num++; } return num;}//5.編寫在非遞減有序鏈表中插入一個元素使鏈表元素仍有序的函數,並利用該函數建立一個非遞減有序單向鏈表。LinkList SortList(LinkList head)//排序為非減鏈表{ LinkList p; if (head->next == NULL) return head; int n=LengthList(head); for(int i=1; i<n; i++) { p=head->next; for(int j=0; j<n-1; j++) { if (p->data > p->next->data) { ElemType tmp=p->data; p->data=p->next->data; p->next->data=tmp; } p=p->next; } } return head;}//4.在單向鏈表中刪除所有的偶數元素結點。LinkList DeleteEven(LinkList head)//刪除偶數元素節點{ LinkList p1,p2; p1=head; p2=p1->next; while(p1->next) { if ((p2->data & 1)==0) { p1->next=p2->next; free(p2); p2=p1->next; } else { p2=p2->next; p1=p1->next; } } return head;}//7.利用演算法5建立兩個非遞減有序單向鏈表,然後合并成一個非遞減鏈表。void MergeList1(LinkList &head,LinkList &l)//合并兩個鏈表,遞增排列{ LinkList p=head; while(p->next!=NULL) { p=p->next; InsertList(l,p->data); } CreateNew(l);}//6.利用演算法5建立兩個非遞減有序單向鏈表,然後合并成一個非遞增鏈表。void MergeList2(LinkList &head,LinkList &l)//合并兩個鏈表,遞減排列{ LinkList p=head; while(p->next!=NULL) { p=p->next; InsertList(l,p->data); } CreateNew(l); ReverseList(l);}//8.利用演算法1建立的鏈表,實現將其分解成兩個鏈表,其中一個全部為奇數,另一個全部為偶數(盡量利用已知的儲存空間)void divide(LinkList head)//分為左右兩部分,左邊的元素為奇數,右邊所有元素為偶數{ LinkList L=head,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 depart(LinkList head,LinkList l){ LinkList q=head,p; q=q->next; while(q->data%2==1) { ElemType x; x=q->data; p=(LinkList)malloc(sizeof(LNode)); p->data=x; p->next=l->next; l->next=p; head->next=q->next; free(q); q=head->next; }}void freelist(LinkList head)//釋放鏈資料表空間{ LinkList l=head; LinkList q; while(l) { q=l; l=l->next; free(q); }}void swap(LinkList head)//交換值的排序{ LinkList l=head,p,q; p=l->next; int j=0; while(p) { 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 head=creat();//顯示 display(head);//排序 LinkList head2=SortList(head); display(head2);//合并鏈表1 MergeList1(head,head2);//合并鏈表2 MergeList2(head,head2); display(head2);//鏈表插入元素 int tt; scanf("%d",&tt); InsertList(head,tt); display(head);//逆置鏈表 ReverseList(head); display(head);//刪除偶數元素 DeleteEven(head); display(head);//按奇偶分解鏈表 divide(head); LinkList l; l=(LinkList)malloc(sizeof(LNode)); l->next=NULL; depart(head,l); display(head); display(l); return 0;}