#include <iostream> #include <stdlib.h> using namespace std; #define MAXSIZE 100 typedef int ElemType; /*线性表的静态链表存储结构*/ typedef struct { ElemType data; int cur;//为0时表示没有后继的元素,类似于NULL }StaticLinkList[MAXSIZE]; /*将一维数组array中各个分量链成一个备用链表,array[0].cur为头指针,“0”表示空指针*/ bool InitList(StaticLinkList array) { cout << "InitList..." << endl; for(int i = 0; i < MAXSIZE - 2; i++) { array[i].cur = i + 1; } array[MAXSIZE - 2].cur = 0;/*最后一个元素是不可以用的,倒数第二个元素的cur为0,表示备用链表的结尾NULL*/ array[MAXSIZE - 1].cur = 0;/*目前链表为空表,最后一个元素的cur为0*/ return true; } /*若备用链表非空,则返回分配的结点下标,否则返回0*/ int Malloc_SLL(StaticLinkList array) { int i = array[0].cur; if(i != 0) { array[0].cur = array[i].cur;/*下一个空结点用来作备用*/ } return i; } /*将下标为k的空闲结点回收到备用链表*/ void Free_SLL(StaticLinkList array, int k) { array[k].cur = array[0].cur;/*把第一个元素的cur值赋值给要删除元素的cur*/ array[0].cur = k;/*把要删除元素的下标赋值给第一个元素的cur值 */ } /*获取静态链表中元素的个数*/ int ListLength(StaticLinkList array) { int count = 0; int index = array[MAXSIZE - 1].cur; while(index != 0) { count++; index = array[index].cur; }//while return count; } /*在array中第pos个元素之前插入新的数据元素elem*/ bool ListInsert(StaticLinkList array, int pos, ElemType elem) { cout << "Insert List from pos: " << pos << "Item" << elem << endl; if(pos < 1 || pos > ListLength(array) + 1)/*1<=pos<=ListLength(array)+1*/ { return false; } int index = MAXSIZE - 1; int k = Malloc_SLL(array);/*获取空闲分量的下标*/ if(k) { array[k].data = elem; for(int i = 1; i < pos; i++) { index = array[index].cur; } array[k].cur = array[index].cur;/*把第pos个元素之前的那个元素的cur赋值给新元素的cur*/ array[index].cur = k;/*把新元素的下标赋值给第pos个元素之前的元素的cur*/ return true; } return false; } /*删除array中第pos个数据元素*/ bool ListDelete(StaticLinkList array, int pos) { cout << "Delete List from pos: " << pos << endl; if(pos < 1 || pos > ListLength(array)) { return false; } int index = MAXSIZE - 1; for(int i = 1; i < pos; i++)//定位到第pos个元素之前的那个元素 { index = array[index].cur; } int tempIndex = array[index].cur; array[index].cur = array[tempIndex].cur; Free_SLL(array, tempIndex); return true; } bool ListTraverse(StaticLinkList array) { cout << "List Traverse: " << endl; int index = MAXSIZE - 1; while(array[index].cur != 0) { index = array[index].cur; cout << array[index].data << ‘ ‘; } cout << endl; return true; } int main(void) { StaticLinkList SLL; InitList(SLL); for(int i= 1; i < 11; i++) { ListInsert(SLL, i, i); } ListTraverse(SLL); ListDelete(SLL, 3); ListTraverse(SLL); cout << "List Length:" << ListLength(SLL) << endl; system("pause"); return 0; }
时间: 2024-11-04 12:23:54