下面为临摹老师的代码:
(1).创建链表
typedef struct LinkNode
{
char data;
struct LinkNode *next;
} LNode,*LinkList,*NodePtr;
(2).建立头节点(初始化)
生成新结点作为头结点,用头指针指向头结点——头结点的指针域置空
头结点和头指针的区分:不管带不带头结点,头指针始终指向单链表的第一个结点,而头结点是带头结点的单链表中的第一个结点,结点内通常不存储信息。
LinkList initLinkList()
{
NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
tempHeader->data = '\0';
tempHeader->next = NULL;
return tempHeader;
}
(3).输出当前链表
void printList(NodePtr paraHeader)
{
NodePtr p = paraHeader->next;
while(p!=NULL)
{
printf("%c",p->data);
p = p->next;
}
printf("\r\n");
}
(4).尾插法插入
void appendElement(NodePtr paraHeader,char paraChar)
{
NodePtr p,q;
q = (NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
q->next = NULL;
p = paraHeader;
while(p->next!=NULL)
{
p = p->next;
}
p->next = q;
}
(5).指定位置插入
void insertElement(NodePtr paraHeader,char paraChar,int paraPosition)
{
NodePtr p,q;
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;
}
}
q=(NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
printf("linking\r\n");
q->next = p->next;
p->next = q;
}
(6).删除指定元素
void deleteElement(NodePtr paraHeader,char paraChar)
{
NodePtr p,q;
p = paraHeader;
while((p->next!=NULL)&&(p->next->data!=paraChar))
{
p=p->next;
}
if(p->next==NULL)
{
printf("Cannot delete %c\r\n",paraChar);
return;
}
q=p->next;
p->next=p->next->next;
free(q);
}
(7).测试
void appendInsertDeleteTest()
{
LinkList tempList = initLinkList();
printList(tempList);
appendElement(tempList, 'H');
appendElement(tempList, 'e');
appendElement(tempList, 'l');
appendElement(tempList, 'l');
appendElement(tempList, 'o');
appendElement(tempList, '!');
printList(tempList);
deleteElement(tempList, 'e');
deleteElement(tempList, 'a');
deleteElement(tempList, 'o');
printList(tempList);
insertElement(tempList, 'o', 1);
printList(tempList);
}
全部代码展示:
#include
#include
/**
*Linked list of characters.The key is data.
*/
typedef struct LinkNode
{
char data;
struct LinkNode *next;
} LNode,*LinkList,*NodePtr;
/**
*Initialize the list with a header.
*@return The pointer to the header.
*/
LinkList initLinkList()
{
NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
tempHeader->data = '\0';
tempHeader->next = NULL;
return tempHeader;
}//Of initLinkList
/**
*Print the list.
*@param paraHeaer The heaer 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 tail.
*@param paraHeader The header of the list.
*@param parachar The given char.
*/
void appendElement(NodePtr paraHeader,char paraChar)
{
NodePtr p,q;
//step 1.Construct a new node.
q = (NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
q->next = NULL;
//step 2.search to the tail.
p = paraHeader;
while(p->next!=NULL)
{
p = p->next;
}//of while
//step 3.Now add/link.
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;
//step 1.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
//step 2.construct a new node.
q=(NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
//step 3.Now link.
printf("linking\r\n");
q->next = p->next;
p->next = q;
}//of insertElement
/**
*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 it
q=p->next;
p->next=p->next->next;
free(q);
}//of deleteElement
/**
*unit test.
*/
void appendInsertDeleteTest()
{
// Step 1. Initialize an empty list.
LinkList tempList = initLinkList();
printList(tempList);
// Step 2. Add some characters.
appendElement(tempList, 'H');
appendElement(tempList, 'e');
appendElement(tempList, 'l');
appendElement(tempList, 'l');
appendElement(tempList, 'o');
appendElement(tempList, '!');
printList(tempList);
// Step 3. Delete some characters (the first occurrence).
deleteElement(tempList, 'e');
deleteElement(tempList, 'a');
deleteElement(tempList, 'o');
printList(tempList);
// Step 4. Insert to a given 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;
tempNode2.data = 6;
tempNode2.next = NULL;
printf("The first node: %d, %d, %d\r\n",&tempNode1, &tempNode1.data, &tempNode1.next);
printf("The second node: %d, %d, %d\r\n",&tempNode2, &tempNode2.data, &tempNode2.next);
tempNode1.next = &tempNode2;
}// Of basicAddressTest
/**
* The entrance.
*/
int main()
{
appendInsertDeleteTest();
}// Of main
void appendInsertDeleteTest() {
LinkList tempList = initLinkList();
printList(tempList);
appendElement(tempList, 'H');
appendElement(tempList, 'e');
appendElement(tempList, 'l');
appendElement(tempList, 'l');
appendElement(tempList, 'o');
appendElement(tempList, '!');
//多加几个字符测试一下
appendElement(tempList, '!');
appendElement(tempList, '!');
appendElement(tempList, '!');
appendElement(tempList, 'S');
appendElement(tempList, 'W');
appendElement(tempList, 'P');
appendElement(tempList, 'U');
printList(tempList);
deleteElement(tempList, 'U');
deleteElement(tempList, 'P');
deleteElement(tempList, 'S');
deleteElement(tempList, 'W');
deleteElement(tempList, 'A');
printList(tempList);
insertElement(tempList, 'o', 1);
printList(tempList);
}
运行结果