#include<stdio.h>
#include<malloc.h>
//定义结构体
typedef struct LinkNode{
char data;
struct LinkNode *next;
} LNode, *LinkList, *NodePtr;
//初始化
LinkList initLinkList(){
NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
tempHeader->data ='\0';
tempHeader->next = NULL;
return tempHeader;
}//Of initLinkList
//遍历单链表
void printList(NodePtr paraHeader){
NodePtr p=paraHeader->next;
while(p!=NULL){
printf("%c",p->data);
p=p->next;
}//Of while
printf("\n");
}//Of printList
//在尾部添加一个元素
void appendElement(NodePtr paraHeader,char paraChar){
NodePtr p,q;
//step 1:生成一个新节点
q=(NodePtr)malloc(sizeof(LNode));
q->data=paraChar;
q->next=NULL;
//step 2:搜索尾部
p=paraHeader;
while(p->next!=NULL){
p=p->next;
}//Of while
//step3:插入
p->next = q;
}// Of appendElement
//插入一个元素
void insertElement(NodePtr paraHeader,char paraChar,int paraPosition){
NodePtr p,q;
//step 1:搜索位置
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:生成一个新节点
q=(NodePtr)malloc(sizeof(LNode));
q->data=paraChar;
//step 3:连接
printf("linking\n");
q->next =p->next;
p->next=q;
}//Of insertElement
//删除一个元素
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\n",paraChar);
return;
}//Of if
q=p->next;
p->next = p->next->next;
free(q);
}//Of deleteElement
//union text
void appendInsertDeleteTest(){
//step 1.初始化一个新链表
LinkList tempList = initLinkList();
printList(tempList);
//step 2.加入一些元素
appendElement(tempList,'H');
appendElement(tempList,'e');
appendElement(tempList,'l');
appendElement(tempList,'l');
appendElement(tempList,'o');
appendElement(tempList,'!');
printList(tempList);
//step 3:删除一些元素
deleteElement(tempList,'e');
deleteElement(tempList,'a');
deleteElement(tempList,'o');
printList(tempList);
//step 4:插入一个位置
insertElement(tempList,'o',1);
printList(tempList);
}// Of appendInsertDeleteTest
/**
*Address test:beyond the kook.
*/
void basicAddressTest(){
LNode tempNode1,tempNode2;
tempNode1.data=4;
tempNode1.next=NULL;
tempNode1.data=6;
tempNode1.next=NULL;
printf("The first node: %d, %d, %d\n",
&tempNode1,&tempNode1.data,&tempNode1.next);
printf("The second node: %d, %d, %d\n",
&tempNode2,&tempNode2.data,&tempNode2.next);
tempNode1.next=&tempNode2;
}// Of basicAddressTest
/**
*The entrace.进入
*/
int main(){
appendInsertDeleteTest();
}// Of main
运行结果:
1.单链表通过一组任意的存储单元来存储线性表中的数据元素,不需要使用地址连续的存储单元。也就不需要连续的存储空间。
2.查找某个特定的结点时,需要从表头开始,依次查找。
制作链表一般包含以下步骤:先定义一个结构体,然后设计初始化,输出,添加,插入,删除的函数,最后设计一个联合的函数。单链表的初始化操作就是申请一个头结点,将指针域置空。遍历单链表:声明一个指针p,从头结点指向的第一个结点开始,如果p不为空,那么就输出当前结点的值,并将p指向下一个结点,直到遍历到最后一个结点为止。,其中删除可以通过free来进行。