#include <stdio.h>
#include <malloc.h>
typedef struct LinkNode {
int data;
struct LinkNode *next;
}LNode, *LinkList, *NodePtr;
/**
*Initialize the List with a header.
*@return a pointer to header.
*/
LinkList initLinkList(){
NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
tempHeader->data = '\0';
tempHeader->next = NULL;
return tempHeader;
}//Of initLinkList
/**
*print the List.
*@param paraHeader the header of the list.
*/
void printList(NodePtr paraHeader){
NodePtr p = paraHeader->next;
while(p != NULL){
printf("%c", p->data);
p = p->next;
} //of while
printf("\r\n");
}//Of printList
/**
*Add an element to the list.
*@param paraHeader The Header of the list.
*@param paraChar The given char.
*/
void appendElement(NodePtr paraHeader, char paraChar){
NodePtr p, q;
//step1. construct a new node.
q = (NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
q->next = NULL;
//step2. Search for the tail.
p = paraHeader;
while(p->next != NULL){
p = p->next;
}//of while
//step3. add the new element
p->next = q;
}//Of appendElement
/**
*Insert an Element to the given position.
*@param paraHeader The Header of the list.
*@param paraChar The given Char.
*@param paraPosition The given Position.
*/
void insertElement(NodePtr paraHeader, char paraChar, int paraPosition){
NodePtr p, q;
//step1. Search to the position.
p = paraHeader ;
for(int i = 0; i < paraPosition; i++){
p = p->next;
if(p==NULL){
printf("the Position %d is beyond the scope of the list ",paraPosition);
return;
}//Of if
}//Of for i
//step2. Construct a new node.
q = (NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
//step3. now link.
printf("linking\r\n");
q->next = p->next;
p->next = q;
}//Of insert
/**
* Delete an element from the list.
* @param paraHeader The header of the list.
* @param paraChar The given char.
*/
void deleteElement(NodePtr paraHeader, char paraChar){
NodePtr p, q;
p = paraHeader;
while((p->next != NULL)&&(p->next->data != paraChar)){
p = p->next;
}//Of while
if (p->next == NULL){
printf("Cannot delete %c\r\n",paraChar);
return;
}//Of if
q = p->next;
p->next = p->next->next;
free(q);
}//deleteElement
/**
*unit.
*/
void appendInsertDeleteTest(){
//step1. Initialize an empty list
LinkList tempList = initLinkList();
printList(tempList);
//step2. Add some characters
appendElement(tempList, 'H');
appendElement(tempList, 'e');
appendElement(tempList, 'l');
appendElement(tempList, 'l');
appendElement(tempList, 'o');
appendElement(tempList, '!');
printList(tempList);
// Step3. Delete some characters (the first occurence)
deleteElement(tempList, 'e');
deleteElement(tempList, 'a');
deleteElement(tempList, 'o');
printList(tempList);
//step4. Insert to agiven position.
insertElement(tempList,'o',1);
printList(tempList);
}//Of appendInsertDeleteTest
/**
* Address test: beyond the book.
*/
void basicAddressTest(){
LNode tempNode1,tempNode2;
tempNode1.data = 4;
tempNode1.next = NULL;
printf("the first node is : %d, %d, %d\r\n",
&tempNode1,&tempNode1.data,&tempNode1.next);
printf("the second node is : %d, %d, %d\r\n",
&tempNode2,&tempNode2.data,&tempNode2.next);
tempNode1.next = &tempNode2;
}//Of basicAddressTest
int main()
{
appendInsertDeleteTest();
}//Of main
运行结果:
个人感悟:
链表的每个节点,除了需要设置一个数据域存储数据元素之外,还需要设置一个指针域,用来表示元素之间的逻辑关系,在元素个数相同时,相比于顺序表,链表需要占用更多的空间。
然而,在进行查找和删除等操作时,对于顺序表,则需要移动大量的节点,时间复杂度为O(n),而对于链表,则只需要修改指针,时间复杂度为O(1)。
因此,当线性表长度较小时,为了节省空间,一般选用顺序表,但若是用于插入删除等操作,则宜用链表作为存储结构。