1.代码如下
#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;
/**
* initial the list with a pointer
*/
ListPtr initLinkedList()
{
// the pointer to the whole 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='\0';
tempPtr->nodes[0].next=-1;
//0:the space is not used
//1:the space is used
tempPtr->used[0]=1;
int i;
for(i=1;i<DEFAULT_SIZE;i++)
{
tempPtr->used[i]=0;
}
return tempPtr;
}
/**
* print the list
*/
void printList(ListPtr paraListPtr)
{
int p=0;
while(p!=-1)
{
printf("%c",paraListPtr->nodes[p].data);
p=paraListPtr->nodes[p].next;
}
printf("\r\n");
}
/**
* insert an elemen to the specific position
*/
void insertElement(ListPtr paraListPtr, char paraChar, int paraPosition)
{
int p,q,i;
//step 1. search to the position
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 ;
}
}
//step 2.create a new node
for(i=1;i<DEFAULT_SIZE;i++)
{
if(paraListPtr->used[i]==0)
{
printf("space at %d allocated.\r\n",i);
paraListPtr->used[i]=1;
q=i;
break;
}
}
if(i==DEFAULT_SIZE)
{
printf("No space.\r\n");
return ;
}
paraListPtr->nodes[q].data=paraChar;
//step 3.link the node
printf("linking\r\n");
paraListPtr->nodes[q].next=paraListPtr->nodes[p].next;
paraListPtr->nodes[p].next=q;
}
/**
* delete an element from the list
*/
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;
}
if(paraListPtr->nodes[p].next==-1)
{
printf("Cannot delete %c\r\n",paraChar);
return ;
}
q=paraListPtr->nodes[p].next;
paraListPtr->nodes[p].next=paraListPtr->nodes[q].next;
//free the deleted node
paraListPtr->used[q]=0;
}
/**
* test the functions above
*/
void appendInsertDeleteTest()
{
//step 1.initialize an empty list
ListPtr tempList=initLinkedList();
printList(tempList);
//step 2.add some elements
insertElement(tempList,'H',0);
insertElement(tempList,'e',1);
insertElement(tempList,'l',2);
insertElement(tempList,'l',3);
insertElement(tempList,'o',4);
printList(tempList);
//step 3.delete some elements
printf("Deleting 'e'.\r\n");
deleteElement(tempList,'e');
printf("Deleting 'a'.\r\n");
deleteElement(tempList,'a');
printf("Deleting 'o'.\r\n");
deleteElement(tempList,'o');
printList(tempList);
insertElement(tempList,'x',1);
printList(tempList);
}
void main()
{
appendInsertDeleteTest();
}
2.图示
3.代码说明
1)用一个动态数组来记录节点是否被使用,0代表未被使用,1代表已被使用
2)当node的next表示-1时,表示NULL
3)在进行插入操作时仍然要考虑是否越界的情况
4)在进行删除操作时要考虑是否到达了链表的末尾
4.运行结果
space at 1 allocated.
linking
space at 2 allocated.
linking
space at 3 allocated.
linking
space at 4 allocated.
linking
No space.
Hell
Deleting 'e'.
Deleting 'a'.
Cannot delete a
Deleting 'o'.
Cannot delete o
Hll
space at 2 allocated.
linking
Hxll
--------------------------------
Process exited after 0.04866 seconds with return value 0
请按任意键继续. . .