代码如下:
#include <stdio.h>
#include <malloc.h>
#define DEFAULT_SIZE 5
typedef struct StaticLinkedNode{
char data;
int next;
} *NodePtr;
typedef struct StaticLinkedList{
NodePtr nodes;
int* used;
} *ListPtr;
/**
* Initialize the list with a header.
* @return The pointer to the header.
*/
ListPtr initLinkedList(){
//The pointer to the whole list space.
ListPtr tempPtr = (ListPtr)malloc(sizeof(struct StaticLinkedList));
//Allocate total space.
tempPtr->nodes = (NodePtr)malloc(sizeof(struct StaticLinkedNode) * DEFAULT_SIZE);
tempPtr->used = (int*)malloc(sizeof(int) * DEFAULT_SIZE);
//The first node is the header.
tempPtr->nodes[0].data = ' ';
tempPtr->nodes[0].next = -1;
//only the first node is used.
tempPtr->used[0] = 1;
for (int i = 1; i < DEFAULT_SIZE; i++){
tempPtr->used[i] = 0;
}//of for i
return tempPtr;
}// of initLinkedList
/**
* @param paraListPtr The pointer to the list.
*/
void printList(ListPtr paraListPtr){
int p = 0;
while (p != -1) {
printf("%c",paraListPtr->nodes[p].data);
p = paraListPtr->nodes[p].next;
}// of while
printf("\r\n");
}// of printList
/**
* Insert an element to the given position.
* @param paraListPtr The position of the list.
* @param parachar The given char.
* @param paraPosition The given position.
*/
void insertElement(ListPtr paraListPtr, char paraChar,int paraPosition){
int p, q, i;
p = 0;
for (i = 0; i < paraPosition; i++) {
p = paraListPtr->nodes[p].next;
if (p == -1) {
printf("The position %d is beyond the scope of the list.\r\n",paraPosition);
return;
}// of if
}// of for i
for (i = 1; i < DEFAULT_SIZE; i++){
if (paraListPtr->used[i] == 0){
//This is identical to malloc.
printf("Space at %d allocated.\r\n",i);
paraListPtr->used[i] = 1;
q = i;
break;
}// of if
}// of for i
if (i == DEFAULT_SIZE){
printf("NO space.\r\n");
return;
}//of if
paraListPtr->nodes[q].data = paraChar;
printf("linking\r\n");
paraListPtr->nodes[q].next = paraListPtr->nodes[p].next;
paraListPtr->nodes[p].next = q;
}
/**
* Delete an element from the list.
*@param paraHeader The header of the list.
*@param paraChar The given char.
*/
void deleteElement(ListPtr paraListPtr, char paraChar){
int p, q;
p = 0;
while ((paraListPtr->nodes[p].next != -1)&&(paraListPtr->nodes[paraListPtr->nodes[p].next].data != paraChar)){
p = paraListPtr->nodes[p].next;
}// of while
if(paraListPtr->nodes[p].next == -1) {
printf("Cannot delete %c\r\n", paraChar);
return;
}// of if
q = paraListPtr->nodes[p].next;
paraListPtr->nodes[p].next = paraListPtr->nodes[paraListPtr->nodes[p].next].next;
//This statement is identical to free(q)
paraListPtr->used[q] = 0;
}// of deleteElement
/**
*Unit test.
*/
void appendInsertDeleteTest(){
ListPtr tempList = initLinkedList();
printList(tempList);
insertElement(tempList, 'H',0);
insertElement(tempList, 'e',1);
insertElement(tempList, 'l',2);
insertElement(tempList, 'l',3);
insertElement(tempList, 'o',4);
printList(tempList);
printf("Deleting 'e'\r\n");
deleteElement(tempList, 'e');
printf("Deleting 'a'\r\n");
deleteElement(tempList, 'o');
printf("Deleting 'o'\r\n");
printList(tempList);
insertElement(tempList, 'x', 1);
printList(tempList);
}// of appendInsertdeleTest
/**
*The entrance.
*/
int main()
{
appendInsertDeleteTest();
}// of main
运行结果:
插入函数:
void insertElement(ListPtr paraListPtr, char paraChar,int paraPosition){
int p, q, i;
p = 0;
for (i = 0; i < paraPosition; i++) {
p = paraListPtr->nodes[p].next;
if (p == -1) {
printf("The position %d is beyond the scope of the list.\r\n",paraPosition);
return;
}// of if
}// of for i
for (i = 1; i < DEFAULT_SIZE; i++){
if (paraListPtr->used[i] == 0){
//This is identical to malloc.
printf("Space at %d allocated.\r\n",i);
paraListPtr->used[i] = 1;
q = i;
break;
}// of if
}// of for i
if (i == DEFAULT_SIZE){
printf("NO space.\r\n");
return;
}//of if
paraListPtr->nodes[q].data = paraChar;
printf("linking\r\n");
paraListPtr->nodes[q].next = paraListPtr->nodes[p].next;
paraListPtr->nodes[p].next = q;
}
删除函数:
void deleteElement(ListPtr paraListPtr, char paraChar){
int p, q;
p = 0;
while ((paraListPtr->nodes[p].next != -1)&&(paraListPtr->nodes[paraListPtr->nodes[p].next].data != paraChar)){
p = paraListPtr->nodes[p].next;
}// of while
if(paraListPtr->nodes[p].next == -1) {
printf("Cannot delete %c\r\n", paraChar);
return;
}// of if
q = paraListPtr->nodes[p].next;
paraListPtr->nodes[p].next = paraListPtr->nodes[paraListPtr->nodes[p].next].next;
//This statement is identical to free(q)
paraListPtr->used[q] = 0;
}// of deleteElement
静态链表的优点:在插入和删除操作的时候,不需要移动元素。
静态链表的缺点:失去了顺序储存结构随机存取的特征,没有解决连续储存分配带来的表长难以确定的问题。
收获和总结:静态链表储存结构中的链式结构的代表,通过对静态链表的学习,让自己对链表有了一定新的认识和感悟。同时通过对闵帆老师代码的敲写,进一步认识到了代码格式规范的重要性,加强了对自己以后写代码格式规范的意识。对静态链表的学习,使自己的对数据结构的学习的进一步加强。
展望:希望在以后跟随闵帆老师学习可以更好的掌握数据结构的知识,提升自己以后的编码能力。