1. 程式人生 > >1基礎-1單鏈表

1基礎-1單鏈表

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct Node{
    int data;
    //struct Node *prior;
    struct Node *next;
}Node;
void CreateRail(Node *head,int a[],int n){//輸入連結串列頭指標值,陣列,長度
    Node *s,*r=head;//定義兩個臨時結點,s用於每次建立,賦給連結串列中的r(rail)結點
    for(int i=1;i<=n;i++){//逐個點插入
        s=(Node*)malloc(sizeof(Node));//S指向新結點
        s->data=a[i];//值賦給結點的data
        r->next=s;//把這個結點賦給連結串列中的結點C
        r=r->next;//r指向它的後繼
    }
    r->next=NULL;//尾指標的next為空
}
void CreateFront(Node *&head,int a[],int n){//輸入連結串列頭指標引用,陣列,長度
    Node* s;//定義臨時結點,因為要與不斷賦給頭指標,所以頭指標要引用傳入
    for(int i=1;i<=n;i++){//逐個點插入
        s=(Node*)malloc(sizeof(Node));//S指向新結點
        s->data=a[i];//值賦給結點的data
        s->next=head->next;//頭結點的後繼賦給新結點
        head->next=s;//然後頭結點指向新結點
    }
}
Node* Search(Node *head,int x){//輸入頭結點及值X,輸出結點值為X的前驅
    for(Node *p=head;p->next!=NULL;p=p->next)//從頭結點起掃到尾結點
        if(p->next->data==x)//如果下一結點的值就是X(要修改結點值在此處修改)
            return p;//返回結點值為X的前驅
    return NULL;//找不到就返回NULL
}
int Delete(Node *p){//輸入要刪除的結點的前驅
    if(p->next==NULL)//如果當前結點就是尾結點
        return 0;//返回0表示刪除失敗
    else{//否則
        Node *q=p->next;//讀出要刪除的結點
        p->next=p->next->next;//當前結點的後繼指向後繼的後繼
        free(q);//釋放要刪除的結點空間
        return 1;//返回1表示刪除成功
    }
}
void Insert(Node *p,int x){//輸入加入結點的前驅及新增結點的值
    Node *s=(Node*)malloc(sizeof(Node));//建立新結點
    s->data=x;//賦值
    s->next=p->next;//賦後繼
    p->next=s;//更新連結串列
}
int main(){//本例程預設是有頭結點的,即第一個結點不存值
    int a[11]={0,1,3,5,7,9,2,4,6,8,10};//定義陣列
    //int n;cin>>n;for(int i=0;i<n;i++)cin>>a[i];
    Node *head1=(Node*)malloc(sizeof(Node));CreateRail(head1,a,10);//建立頭結點並用尾插法建表
    for(Node *p=head1;p->next!=NULL;p=p->next)cout<<p->next->data<<' ';cout<<endl;//觀察連結串列
    Node *tmp1=Search(head1,9);Delete(tmp1);//刪除連結串列中值為9的結點
    for(Node *p=head1;p->next!=NULL;p=p->next)cout<<p->next->data<<' ';cout<<endl;//觀察連結串列
    Node *head2=(Node*)malloc(sizeof(Node));CreateRail(head2,a,10);//建立頭結點並用頭插法建表
    for(Node *p=head2;p->next!=NULL;p=p->next)cout<<p->next->data<<' ';cout<<endl;//觀察連結串列
    Node *tmp2=Search(head2,8);Insert(tmp2->next,11);//在值為8的結點後加入值為11的結點
    for(Node *p=head2;p->next!=NULL;p=p->next)cout<<p->next->data<<' ';cout<<endl;//觀察連結串列
    return 0;
}
/***output
1 3 5 7 9 2 4 6 8 10
1 3 5 7 2 4 6 8 10
1 3 5 7 9 2 4 6 8 10
1 3 5 7 9 2 4 6 8 11 10
***/