資料結構中的線性表程式碼實現

牛掰是怎麼形成的發表於2017-11-04

define ElemType int

define OK 1

define ERROR 0

include “stdafx.h”

include“iostream” 不能用<>奇怪只能用“”

include“errors.h”不能用<>奇怪只能用“”你們報錯可以在vs用<>

typedef int Statue;

int const LINST_INIT_SIZE = 100;
int const LISTINCREATMENT = 10;

typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;

//初始化連結串列
Statue InitList_Sq(SqList &L)
{
//構造空表L
L.elem = (ElemType )malloc(LINST_INIT_SIZE sizeof(ElemType));

//分配成功判斷

if (!L.elem) exit(OVERFLOW);

//線性表元素初始為0個
L.length = 0;

//儲存當前線性表的記憶體容量
L.listsize = LINST_INIT_SIZE;

return OK;

}

//線性表的插入
Statue ListInsert(SqList &L, int i, ElemType e)
{
//在順序表L中第i個位置插入新元素e

//插入位置判斷
if (i < 1 || i > L.length + 1) return ERROR;

//滿判斷
if (L.length >= L.listsize)  perror("OVERFLOW");

//開始騰出待插入位置
for (int i = L.length - 1; i > i - 1; i--)
{
    L.elem[i + 1] = L.elem[i];
}

//開始插入元素e
L.elem[i - 1] = e;

//線性表元素增加1
L.length++;


return OK;

}

//線性表的刪除
Statue LinkDelete_Sq(SqList &L, int i, ElemType &e)
{
//刪除位置判斷
if (i < 1 || i > L.length) return ERROR;

//空連結串列判斷
if (L.length == 0) perror("當前連結串列為空,無法刪除資料。");

//開始儲存待刪除位置的元素
e = L.elem[i - 1];

//開始移動刪除元素後面的全部資料
for (int j = i - 1; j < L.length - 1; j++)
{
    L.elem[j] = L.elem[j + 1];
}

//開始減少1個元素
L.length--;

return OK;

}

//判斷線性表L是否為空
bool ListEmpty(SqList &L)
{
return L.length == 0;
}

//得到線性表的長度,即線性表中元素的數量

int ListLength(SqList &L)
{
return L.length;
}

//線性單連結串列的節點資料型別定義
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;

//初始化線性連結串列
Statue InitList_L(LinkList &L)
{
//建立頭節點
L = (LinkList)malloc(sizeof(LNode));

//開始給頭節點初始化
L->data = -1;
L->next = NULL;

return OK;

}

//線上性連結串列中取第i個資料存放在元素e
//預設單連結串列有頭節點
Statue GetElem_L(LinkList L, int i, ElemType &e)
{
//儲存單連結串列頭指標,防止更改了頭指標裡面的地址,導致其他地方無法使用
LinkList p = L;
int j = 1; //用來記錄節點增加的數目

//開始定位i位置的節點
//開始拿到第一個節點元素地址
p = p->next;

//通過迴圈找到待查詢節點的位置
while (p && j < i) //當p不為空以及沒有跑到所要節點位置就一直迴圈
{
    p = p->next;
    j++;    
}

//開始判斷是不是找到待查節點的位置
//當p = null代表定位的位置超出連結串列節點數量
//首先我們預設i只能取值從1開始表示第一個節點
//得到j > i告訴了我們定位的i取值小於1也就是想找第一個節點之前的
//當然是不存在這種節點
if (!p || j > i) 
  return ERROR;//沒有找到待查詢的位置

//程式碼進入這裡說明在連結串列中找到了待查位置的節點
//開始儲存需要節點的資料到e中
e = L->data;

return OK;

}

//往帶頭結點單連結串列插入節點e
Statue InsertNode(LinkList L, int i, ElemType &e)
{
//首先定義一個節點型別變數儲存當前連結串列地址
LinkList q = L;

//新建一個節點,用於將e資料存入新節點當中
LinkList p = (LinkList)malloc(sizeof(LNode));

//判斷是不是分配成功
if (!p) exit(OVERFLOW);

//開始寫入資料
p->data = e;

//定義變數用於記錄節點增加數量
int j = 1;

//開始通過迴圈找到待插位置的前一個節點
while (q && j < i - 1)
{
    q = q->next;
    j++;
}

//判斷是不是找到需要的節點
if (!p || j > i)  return ERROR;

//開始將節點p插入連結串列
p->next = q->next;
q->next = p;

return OK;

}

//單連結串列定位元素e的位置
LNode* LocateElem_L(LinkList L, ElemType e)
{
//找到第一個出現值和e相同的節點,並返回其地址,不存在則返回null
//先判當前連結串列是不是為null

LinkList p;
if (!L)
{
    return NULL;
}

p = L;

//開始遍歷連結串列查詢節點中資料為e的節點
while (p && p->data != e)
{
    p = p->next;
}

return p;

}

//線性表的應用
//比如2個線性表的大小 注意A,B是用的順序儲存連結串列
int Compare(SqList A, SqList B)
{
//如果A < B 返回-1,A = B 返回0 反之返回1

int j = 0; //用於記錄順序連結串列A和B共同部分的索引值

//開始使用迴圈遍歷連結串列節點比較A和B連結串列上的節點大小
while (j < A.length && j < B.length) //保證遍歷完順序表中長度小的連結串列
{
    if (A.elem[j] > B.elem[j])
    {
        return 1;  //出現A連結串列中的節點資料大
    }
    else if(A.elem[j] == B.elem[j]) //如果比較的節點是相等,那麼我們都把索引+1,比較順序表下一個節點資料
    {
        j++;
    }
    else   //B中節點大
    {
        return -1;
    }

    if (A.length == B.length) return 0; //執行上面迴圈出現當前結果表示連結串列長度一樣,並且資料也都相等

    if (A.length > B.length) return 1;  //表示A連結串列和B連結串列共有部分資料是一樣的,但是A連結串列元素更多


    return -1;  //這個是B連結串列元素多的情況
}

}

int main()
{
return 0;
}

相關文章