數據結構入門之———離散存儲結構【鏈表】

數據結構入門之———離散存儲結構【鏈表】

郝斌

xcode

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct Node
{
    int data;   //數據域
    struct Node *pNext; //指針域
}NODE,* PNODE;//NODE等價於typedef struct Node,PNODE等價於typedef struct Node *

//函數原型
PNODE creat_List(void);
void traverse_List(PNODE pHead);
bool is_empty(PNODE pHead);
int length_List(PNODE pHead);
bool insert_List(PNODE,int ,int);
/*在phead所指向鏈表的第pos個節點的前面插入一個新的節點,該節點的值是val,並且pos的值是從1開始*/
bool delete_List(PNODE,int,int *);
void sort_List(PNODE pHead);


int main(void)
{
    PNODE pHead = NULL;
    int val;
    
    pHead = creat_List();       //創建一個非循環單鏈表,並將該j鏈表的頭節點的地址賦給pHead
    traverse_List(pHead);
    if(delete_List(pHead,4,&val))
    {
        printf("刪除成功,您刪除的元素是:%d\n",val);
    }
    else
    {
        printf("刪除失敗!,您刪除的元素不存在!\n");
    }
    traverse_List(pHead);
    
    return 0;
}

PNODE  creat_List(void)
{
    int len;        //用來存放有效節點的個數
                    
    int val;        //用來臨時存放用戶輸入的節點的值
    //分配了一個不存放有效數據的頭節點
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if(NULL == pHead)
    {
        printf("分配失敗,程序終止!\n");
        exit(-1);
    }
    PNODE pTail = pHead;
    pTail->pNext = NULL;
    
    printf("請輸入您需要生成的鏈表節點的個數:len = ");
    scanf("%d",&len);
    
    for(int i = 0;i<len;i++)
    {
        printf("請輸入第%d個節點的值:",i+1);
        scanf("%d",&val);
        
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        if(NULL == pNew)
        {
            printf("分配失敗,程序終止!\n");
            exit(-1);
        }
        pNew->data = val;
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }
    
    return pHead;
}


/*打印鏈表*/
void traverse_List(PNODE pHead)
{
    PNODE p = pHead->pNext;
    while(NULL != p)
    {
        printf("%d  ",p->data);
        p = p->pNext;
    }
    printf("\n");
    return;
}

/*檢測是否爲空*/
bool is_empty(PNODE pHead)
{
    if(NULL == pHead->pNext)
        return true;
    else
        return false;
}

int length_List(PNODE pHead)
{
    PNODE p = pHead->pNext;
    int len = 0;
    while(p != NULL)
    {
        len++;
        p = p->pNext;
    }
    return len;
}

void sort_List(PNODE pHead)
{
    int i,j,t;
    int len = length_List(pHead);
    PNODE p,q;
    
    for(i = 0,p=pHead->pNext;i<len-1; ++i,p=p->pNext)
    {
        for(j=i+1,q=p->pNext;j<len;++j,q=q->pNext)
        {
            if(p->data > q->data)       //類似於數組中的:a[i]>a[j]
            {
                t = p->data;        //類似於數組中的:t = a[i]
                p->data = q->data;  //類似於數組中的:a[i] = a[j]
                q->data = t;        //類似於數組中的:a[j] = t
            }
        }
            
    }
}
/*在phead所指向鏈表的第pos個節點的前面插入一個新的節點,該節點的值是val,並且pos的值是從1開始*/
bool insert_List(PNODE pHead,int pos,int val)
{
    int i = 0;
    PNODE p = pHead;
    
    while(NULL != p && i<pos-1)
    {
        p = p->pNext;
        i++;
    }
    
    if(i>pos-1 || NULL == p)
        return false;
    
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if(NULL == pNew)
    {
        printf("動態內存分配失敗!\n");
        exit(-1);
    }
    pNew->data = val;
    pNew->pNext = p->pNext;
    p->pNext = pNew;
    
    return true;
}

bool delete_List(PNODE pHead,int pos,int *pVal)
{
    int i = 0;
    PNODE p = pHead;
    
    
    //待看懂
    
    while(NULL != p->pNext && i<pos-1)
    {
        p = p->pNext;
        i++;
    }
    
    if(i>pos-1 || NULL == p->pNext)
        return false;
    
    
    
    
    
    PNODE q = p->pNext;
    *pVal = q->data;
    
    p->pNext = p->pNext->pNext;
    free(q);
    q = NULL;
    
    return true;
}

程序運行示例:
——————————————————————————
請輸入您需要生成的鏈表節點的個數:len = 4
請輸入第1個節點的值:1 4 2 5
請輸入第2個節點的值:請輸入第3個節點的值:請輸入第4個節點的值:1 4 2 5
刪除成功,您刪除的元素是:5
1 4 2
Program ended with exit code: 0
——————————————————————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章