數(shù)據(jù)結(jié)構(gòu)和算法(二)線性表

線性表(單項(xiàng)鏈表)

在C用struct實(shí)現(xiàn)鏈表

  • 創(chuàng)建 intList,開(kāi)辟內(nèi)存空間,創(chuàng)建next下一個(gè)節(jié)點(diǎn)為null,如果開(kāi)辟的地址為null返回錯(cuò)誤
  • 增加:找到要插入的節(jié)點(diǎn),創(chuàng)建一個(gè)新的struct,然后插入List里將第一個(gè)list的Next指向插入的struct
  • 查找:傳入list,查找需要index,返回elem指針
  • 刪除:找到需要?jiǎng)h除的index,把指向上一個(gè)指針指向下一個(gè),釋放內(nèi)存
  • 打?。褐苯友h(huán)鏈表輸出
  • 清空,就是一個(gè)一個(gè)的刪除
  • 前插法:創(chuàng)建一個(gè)指針結(jié)構(gòu)體,然后一步一步插入
  • 記得每次開(kāi)辟空間之后釋放
#include <stdio.h>
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"

#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OK 1

#define MAXSIZE 20 /* 存儲(chǔ)空間初始分配量 */

typedef int Status;/* Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等 */
typedef int ElemType;/* ElemType類型根據(jù)實(shí)際情況而定,這里假設(shè)為int */

//定義結(jié)點(diǎn)
typedef struct Node{
    ElemType data;
    struct Node *next;
}Node;

typedef struct Node * LinkList;


//2.1 初始化單鏈表線性表
Status InitList(LinkList *L){
    
    //產(chǎn)生頭結(jié)點(diǎn),并使用L指向此頭結(jié)點(diǎn)
    *L = (LinkList)malloc(sizeof(Node));
    //存儲(chǔ)空間分配失敗
    if(*L == NULL) return ERROR;
    //將頭結(jié)點(diǎn)的指針域置空
    (*L)->next = NULL;
    
    return OK;
}


//2.2 單鏈表插入
/*
 初始條件:順序線性表L已存在,1≤i≤ListLength(L);
 操作結(jié)果:在L中第i個(gè)位置之后插入新的數(shù)據(jù)元素e,L的長(zhǎng)度加1;
 */
Status ListInsert(LinkList *L,int i,ElemType e){
 
    int j;
    LinkList p,s;
    p = *L;
    j = 1;
    
    //尋找第i-1個(gè)結(jié)點(diǎn)
    while (p && j<i) {
        p = p->next;
        ++j;
    }
    
    //第i個(gè)元素不存在
    if(!p || j>i) return ERROR;
    
    //生成新結(jié)點(diǎn)s
    s = (LinkList)malloc(sizeof(Node));
    //將e賦值給s的數(shù)值域
    s->data = e;
    //將p的后繼結(jié)點(diǎn)賦值給s的后繼
    s->next = p->next;
    //將s賦值給p的后繼
    p->next = s;
    
    return OK;
}


//2.3 單鏈表取值
/*
 初始條件: 順序線性表L已存在,1≤i≤ListLength(L);
 操作結(jié)果:用e返回L中第i個(gè)數(shù)據(jù)元素的值
 */
Status GetElem(LinkList L,int i,ElemType *e){
    
    //j: 計(jì)數(shù).
    int j;
    //聲明結(jié)點(diǎn)p;
    LinkList p;
    
    //將結(jié)點(diǎn)p 指向鏈表L的第一個(gè)結(jié)點(diǎn);
    p = L->next;
    //j計(jì)算=1;
    j = 1;
    
    
    //p不為空,且計(jì)算j不等于i,則循環(huán)繼續(xù)
    while (p && j<i) {
        
        //p指向下一個(gè)結(jié)點(diǎn)
        p = p->next;
        ++j;
    }
    
    //如果p為空或者j>i,則返回error
    if(!p || j > i) return ERROR;
    
    //e = p所指的結(jié)點(diǎn)的data
    *e = p->data;
    return OK;
    
    
}

//2.4 單鏈表刪除元素
/*
 初始條件:順序線性表L已存在,1≤i≤ListLength(L)
 操作結(jié)果:刪除L的第i個(gè)數(shù)據(jù)元素,并用e返回其值,L的長(zhǎng)度減1
 */

Status ListDelete(LinkList *L,int i,ElemType *e){
    
    int j;
    LinkList p,q;
    p = (*L)->next;
    j = 1;
    
    //查找第i-1個(gè)結(jié)點(diǎn),p指向該結(jié)點(diǎn)
    while (p->next && j<(i-1)) {
        p = p->next;
        ++j;
    }
    
    //當(dāng)i>n 或者 i<1 時(shí),刪除位置不合理
    if (!(p->next) || (j>i-1)) return  ERROR;
    
    //q指向要?jiǎng)h除的結(jié)點(diǎn)
    q = p->next;
    //將q的后繼賦值給p的后繼
    p->next = q->next;
    //將q結(jié)點(diǎn)中的數(shù)據(jù)給e
    *e = q->data;
    //讓系統(tǒng)回收此結(jié)點(diǎn),釋放內(nèi)存;
    free(q);
    
    return OK;
}

/* 初始條件:順序線性表L已存在 */
/* 操作結(jié)果:依次對(duì)L的每個(gè)數(shù)據(jù)元素輸出 */
Status ListTraverse(LinkList L)
{
    LinkList p=L->next;
    while(p)
    {
        printf("%d\n",p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}

/* 初始條件:順序線性表L已存在。操作結(jié)果:將L重置為空表 */
Status ClearList(LinkList *L)
{
    LinkList p,q;
    p=(*L)->next;           /*  p指向第一個(gè)結(jié)點(diǎn) */
    while(p)                /*  沒(méi)到表尾 */
    {
        q=p->next;
        free(p);
        p=q;
    }
    (*L)->next=NULL;        /* 頭結(jié)點(diǎn)指針域?yàn)榭?*/
    return OK;
}

//3.1 單鏈表前插入法
/* 隨機(jī)產(chǎn)生n個(gè)元素值,建立帶表頭結(jié)點(diǎn)的單鏈線性表L(前插法)*/
void CreateListHead(LinkList *L, int n){
    
    LinkList p;
    
    //建立1個(gè)帶頭結(jié)點(diǎn)的單鏈表
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;
    
    //循環(huán)前插入隨機(jī)數(shù)據(jù)
    for(int i = 0; i < n;i++)
    {
        //生成新結(jié)點(diǎn)
        p = (LinkList)malloc(sizeof(Node));
       
        //i賦值給新結(jié)點(diǎn)的data
        p->data = i;
        //p->next = 頭結(jié)點(diǎn)的L->next
        p->next = (*L)->next;
        
        //將結(jié)點(diǎn)P插入到頭結(jié)點(diǎn)之后;
        (*L)->next = p;
        
    }
}

//3.2 單鏈表后插入法
/* 隨機(jī)產(chǎn)生n個(gè)元素值,建立帶表頭結(jié)點(diǎn)的單鏈線性表L(后插法)*/
void CreateListTail(LinkList *L, int n){
    
    LinkList p,r;
 
    //建立1個(gè)帶頭結(jié)點(diǎn)的單鏈表
    *L = (LinkList)malloc(sizeof(Node));
    //r指向尾部的結(jié)點(diǎn)
    r = *L;
    
    for (int i=0; i<n; i++) {
        
        //生成新結(jié)點(diǎn)
        p = (Node *)malloc(sizeof(Node));
        p->data = i;
        
        //將表尾終端結(jié)點(diǎn)的指針指向新結(jié)點(diǎn)
        r->next = p;
        //將當(dāng)前的新結(jié)點(diǎn)定義為表尾終端結(jié)點(diǎn)
        r = p;
    }
    
    //將尾指針的next = null
    r->next = NULL;
    
}

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    
    Status iStatus;
    LinkList L1,L;
    struct Node *L2;
    ElemType e;
    
//    L1 =(LinkList) malloc(sizeof(Node));
//    L2 =(LinkList) malloc(sizeof(Node));
//
//    L1->data = 1;
//    L2->data = 2;
//    printf("L1.data=%d,L2.data=%d\n",L1->data,L2->data);
    
    //2.1 單鏈表初始化
    iStatus = InitList(&L);
    printf("L 是否初始化成功?(0:失敗,1:成功) %d\n",iStatus);
    
    //2.2 單鏈表插入數(shù)據(jù)
    for(int j = 1;j<=10;j++)
    {
        iStatus = ListInsert(&L, 1, j);
    }
    printf("L 插入后\n");
    ListTraverse(L);
    
    //2.3 單鏈表獲取元素
    GetElem(L,5,&e);
    printf("第5個(gè)元素的值為:%d\n",e);
    
    //2.4 刪除第5個(gè)元素
    iStatus = ListDelete(&L, 5, &e);
    printf("刪除第5個(gè)元素值為:%d\n",e);
    ListTraverse(L);
    
    //3.1 前插法整理創(chuàng)建鏈表L
    iStatus = ClearList(&L);
    CreateListHead(&L, 20);
    printf("整理創(chuàng)建L的元素(前插法):\n");
    ListTraverse(L);
    
    //3.2 后插法整理創(chuàng)建鏈表L
    iStatus = ClearList(&L);
    CreateListTail(&L, 20);
    printf("整理創(chuàng)建L的元素(后插法):\n");
    ListTraverse(L);
    
}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容