資料結構第二章線性表---課本程式碼
阿新 • • 發佈:2019-02-14
1.線性表的順序儲存
#include<iostream>
using namespace std;
typedef int ElemType;
typedef int Status;
//線性表的定義
typedef struct{
int n; // 統計順序表真實的容量
int maxLength; //統計最大容量
ElemType *element; //順序表的首地址
}SeqList;
//初始化
Status Init(SeqList *L,int mSize){
L->n=0;
L->maxLength=mSize;
L->element=(ElemType *)malloc (sizeof(ElemType)*mSize); //動態生成一維陣列空間
if(!L->element)
return 0;
return 1;
}
//查詢ai的值(下標為i的數)
Status Find(SeqList L,int i,ElemType *x){
if(i<0||i>L.n-1)
return 0;
*x=L.element[i]; //通過x返回待查詢的值
return 1;
}
//插入,插入的位置是i+1,插入x
Status Insert(SeqList *L,int i,ElemType x){
if (i<-1||i>L->n-1) //下標越界
return 0;
if(L->n==L->maxLength) //線性表滿
return 0;
for(int j=L->n-1;j>i;j--)
L->element[j+1]=L->element[j];
L->element[i+1]=x;
L->n=L->n+1;
return 1;
}
//刪除,將元素ai刪除
Status Delete(SeqList *L,int i){
if (i<0||i>L->n-1)
return 0;
if(!L->n) //防止空表
return 0;
for(int j=i+1;j<=L->n;j++)
L->element[j-1]=L->element[j];
L->n--;
return 1;
}
//輸出
Status Output(SeqList L){
if(!L.n)
return 0;
for(int j=0;j<=L.n-1;j++)
cout<<L.element[j]<<" ";
cout<<endl;
return 1;
}
//撤銷運算
void Destroy(SeqList *L){
L->maxLength=0;
L->n=0;
free(L->element);
}
int main(){
int i;
SeqList list;
Init(&list,10);
for(i=0;i<9;i++)
Insert(&list,i-1,i); //在位置ai+1處進行插入i
Output(list);
Delete(&list,0);
Output(list);
Destroy(&list);
return 0;
}
2.線性表的鏈式儲存
#include<iostream>
using namespace std;
typedef int ElemType;
typedef int Status;
//定義每個結點,資料域和指標域
typedef struct node{
ElemType element;
struct node *link;
}node;
//定義單鏈表
typedef struct{
node *first; //頭指標,只向單鏈表的首地址
int n; // 連結串列的真實長度
}SingleList;
//初始化
Status Init(SingleList *L){
L->n=0;
L->first=NULL;
return 1;
}
//查詢,查詢ai
Status Find(SingleList L,int i,ElemType *x){
node *p;
if(i<0||i>L.n-1)
return 0;
p=L.first;
for(int j=0;j<i;j++)
p=p->link;
*x=p->element; // 通過x返回找到的值
return 1;
}
//插入,插入的位置i+1,插入的數x
Status Insert(SingleList *L,int i,ElemType x){
node *p,*q;
if(i<-1||i>L->n-1)
return 0;
p=L->first;
for(int j=0;j<i;j++) p=p->link; //p是帶插入結點的前驅結點,p指向ai
q=(node *)malloc(sizeof(node )); //生成結點q
q->element=x;
if(i>-1){ //插入的不是頭結點
q->link=p->link;
p->link=q;
}
else{
q->link=L->first; //新結點插在頭結點前,成為新的頭結點
L->first=q;
}
L->n++;
return 1;
}
//單鏈表的刪除,刪除元素ai
Status Delete(SingleList *L,int i){
node *p,*q;
if(!L->n)
return 0;
if(i<0||i>L->n-1)
return 0;
p=L->first;
q=L->first;
for(int j=0;j<i-1;j++)
q=q->link; //q是待刪結點的前驅結點
if(i==0){ //待刪除的是頭結點
L->first=L->first->link;
}
else{
p=q->link; //p是待刪結點
q->link=p->link;
}
free(p); // 釋放p的儲存空間
L->n--;
return 1;
}
//單鏈表的輸出
Status Output(SingleList L){
node *p;
if(!L.n)
return 0;
p=L.first;
while(p){
cout<<p->element<<" ";
p=p->link;
}
cout<<endl;
return 1;
}
//單鏈表的撤銷,從頭到尾一個一個的撤銷
Status Destory(SingleList *L){
node *p; //p用來儲存刪除當前頭結點後的頭結點的位置,避免造成斷鏈
while(L->first){
p=L->first->link;
free(L->first);
L->first=p;
}
return 1;
}
int main(){
int i,x;
SingleList list;
Init(&list);
for(i=0;i<9;i++)
Insert(&list,i-1,i);
cout<<"The linklist is: "<<endl;
Output(list);
Delete(&list,0);
cout<<"The linklist is: "<<endl;
Output(list);
Find(list,0,&x);
cout<<"The value is: "<<endl;
cout<<x<<endl;
Destory(&list);
return 0;
}
3.帶表頭的雙鏈表
寫代表頭的雙鏈表的時候,寫到撤銷那裡錯了,後面修改。
/*帶表頭的單鏈表
先前處理單鏈表,由於頭結點沒有直接前驅,所以需要作為特殊情況單獨處理,
為了簡化演算法,我們在頭結點前加一個表頭結點*/
#include<iostream>
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct node{
ElemType element; //資料域
struct node *link; //指標域
}node;
typedef struct{
struct node *head;
int n; //連結串列的真實長度
}HeaderList;
//初始化構造一個僅帶有一個表頭結點的空的單鏈表
Status Init(HeaderList *list){
list->head=(node *)malloc(sizeof(node));
if(!list->head)
return 0;
list->n=0;
list->head->link=NULL;
return 1;
}
//插入操作,在ai+1的位置插入x
Status Insert(HeaderList *list,int i,ElemType x){
if(i<-1||i>list->n-1){
return 0;
}
node *p,*q;
p=list->head;
for(int j=0;j<=i;j++) p=p->link;
q=(node *)malloc(sizeof(node));
q->element=x;
q->link=p->link;
//p是帶插入位置的前驅結點,q是帶插入的位置
p->link=q;
list->n++;
return 1;
}
//刪除操作,刪除ai.p是待刪結點的前驅結點,q是待刪結點
Status Delete(HeaderList *list,int i){
node *p,*q;
if(!list->n)
return 0;
if(i<0||i>list->n-1)
return 0;
p=list->head;
for(int j=0;j<i;j++) p=p->link;
q=p->link;
p->link=q->link;
free(q);
list->n--;
return 1;
}
//輸出
Status Output(HeaderList list){
node *p;
p=list.head->link;
while(p){
cout<<p->element;
p=p->link;
}
cout<<endl;
return 1;
}
//查詢ai,通過x返回該值
Status Find(HeaderList list,int i,ElemType *x){
if(i<0||i>list.n-1)
return 0;
node *p;
p=list.head;
for(int j=0;j<=i;j++) p=p->link;
*x=p->element;
return 1;
}
////撤銷操作,從頭到尾
//Status Destroy(HeaderList *list){
// node *p=list->head;
// while(p){
// p=list->head->link;
// free(list->head);
// list->head=p;
// }
// return 1;
//}
int main(){
int i,x;
HeaderList list;
Init(&list);
for(i=0;i<9;i++){
Insert(&list,i-1,i);
}
cout<<"the headlist is:";
Output(list);
Delete(&list,0);
cout<<"the headlist is:";
Output(list);
Find(list,0,&x);
cout<<"the value is:";
cout<<x<<endl;
// Destroy(&list);
return 0;
}