#include<stdio.h>#include<malloc.h>#defineDEFAULT_SIZE5typedefstructStaticLinkedNode{char data;int next;}*NodePtr;typedefstructStaticLinkedList{
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(StaticLinkedList));// Allocate total space.
tempPtr->nodes =(NodePtr)malloc(sizeof(structStaticLinkedNode)* 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;// Only the first node is used.
tempPtr->used[0]=1;for(int i =1; i < DEFAULT_SIZE; i ++){
tempPtr->used[i]=0;}// Of for ireturn tempPtr;}// Of initLinkedList/**
* Print the list.
* @param paraListPtr The pointer to the list.
*/voidprintList(ListPtr paraListPtr){int p =0;while(p !=-1){printf("%c", paraListPtr->nodes[p].data);
p = paraListPtr->nodes[p].next;}// Of whileprintf("\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.
*/voidinsertElement(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;}// Of if}// Of for i// Step 2. Construct a new node.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 iif(i == DEFAULT_SIZE){printf("No space.\r\n");return;}// Of if
paraListPtr->nodes[q].data = paraChar;// Step 3. Now link.printf("linking\r\n");
paraListPtr->nodes[q].next = paraListPtr->nodes[p].next;
paraListPtr->nodes[p].next = q;}// Of insertElement/**
* Delete an element from the list.
* @param paraHeader The header of the list.
* @param paraChar The given char.
*/voiddeleteElement(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 whileif(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.
*/voidappendInsertDeleteTest(){// Step 1. Initialize an empty list.
ListPtr tempList =initLinkedList();printList(tempList);// Step 2. Add some characters.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 characters (the first occurrence).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);}// Of appendInsertDeleteTest/**
* The entrance.
*/voidmain(){appendInsertDeleteTest();}// Of main
我的代码
#include<stdio.h>#include<malloc.h>#defineDEFAULT_SIZE5//静态链表定义typedefstructStaticLinkedNode{char data;int next;}*NodePtr;typedefstructStaticLinkedList{
NodePtr nodes;int* used;}*ListPtr;/**
* Initialize the list with a header.
* @return The pointer to the header.
*///链表初始化
ListPtr initLinkedList(){//the poiter to the whole list space.
ListPtr tempPtr =(ListPtr)malloc(sizeof(StaticLinkedList));//Allocate total sapce.
tempPtr->nodes =(NodePtr)malloc(sizeof(structStaticLinkedNode)* 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;//Only the first node is used.
tempPtr->used[0]=1;for(int i =1; i < DEFAULT_SIZE; i++){
tempPtr->used[i]=0;}//Of for ireturn tempPtr;}/**
* Print the list.
* @param paraListPtr The pointer to the list.
*/voidprintList(ListPtr paraListPtr){int p = paraListPtr->nodes[0].next;if(p ==-1){printf("the list is empty\n");return;}while(p !=-1){printf("%c", paraListPtr->nodes[p].data);
p = paraListPtr->nodes[p].next;}//Of whileprintf("\r\n");}//Of printList//插入元素voidinsertElement(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.\n", paraPosition);return;}//Of if}//Of for//Step 2.Construct a new node.for(i =1; i < DEFAULT_SIZE; i++){if(paraListPtr->used[i]==0){//This is identical to malloc.printf("Space at %d allocated.", i);
paraListPtr->used[i]=1;
q = i;break;}//of if}//of forif(i == DEFAULT_SIZE){printf("No space.\n");return;}//Of if
paraListPtr->nodes[q].data = paraChar;//Step 3.Now link.
paraListPtr->nodes[q].next = paraListPtr->nodes[p].next;
paraListPtr->nodes[p].next = q;printf("linking\r\n");}//插入测试代码voidinsertElementTest(){printf("--- The insertElementTest Begin ---\n");
ListPtr tempList =initLinkedList();printList(tempList);insertElement(tempList,'A',0);insertElement(tempList,'B',1);insertElement(tempList,'C',2);printList(tempList);insertElement(tempList,'0',6);insertElement(tempList,'D',2);insertElement(tempList,'5',0);printList(tempList);printf("--- The insertElementTest End ---\n");}/**
* Delete an element from the list.
* @param paraHeader The header of the list.
* @param paraChar The given char.
*///删除元素voiddeleteElement(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 whileif(paraListPtr->nodes[p].next ==-1){printf("Cannot delete the %c\r\n", paraChar);return;}//Of of
q = paraListPtr->nodes[p].next;//targeted key
paraListPtr->nodes[p].next = paraListPtr->nodes[q].next;//this statiement is identical to free(q)
paraListPtr->used[q]=0;}//删除元素测试voiddeleteTest(){printf("--- The deleteTest Begin ---\n");//Step 1.Initialize an empty list.
ListPtr tempList =initLinkedList();printList(tempList);//Step 2.Add some characters.insertElement(tempList,'A',0);insertElement(tempList,'B',1);insertElement(tempList,'C',2);insertElement(tempList,'D',3);printList(tempList);//Step 3.Delete some characters(the first occurence).printf("Deleting 'A'.\r\n");deleteElement(tempList,'A');printList(tempList);printf("Deleting 'C'.\r\n");deleteElement(tempList,'C');printList(tempList);printf("Deleting 'D'.\r\n");deleteElement(tempList,'D');printList(tempList);printf("header.next = %d\n", tempList->nodes[0].next);insertElement(tempList,'X',1);printList(tempList);printf("--- The deleteTest End ---\n");}//查找元素intlocateElement(ListPtr paraList,char paraData){int p;
p =0;while(paraList->nodes[p].data != paraData && p !=-1){
p = paraList->nodes[p].next;}if(p ==-1){printf("Don't have the data.\n");}return p;}//查找元素测试voidlocateElementTest(){printf("--- The locateElementTest Begin ---\n");int temp;
ListPtr tempList =initLinkedList();printList(tempList);insertElement(tempList,'A',0);insertElement(tempList,'B',1);insertElement(tempList,'C',2);insertElement(tempList,'D',3);printList(tempList);
temp =locateElement(tempList,'A');printf("%c\n", tempList->nodes[temp].data);
temp =locateElement(tempList,'B');printf("%c\n", tempList->nodes[temp].data);printf("%c\n", tempList->nodes[tempList->nodes[temp].next].data);printf("--- The locateElementTest End ---\n");}intmain(){locateElementTest();insertElementTest();deleteTest();return0;}