代码如下 带有些许注释
#include <stdio.h>
#include <malloc.h>
typedef struct LinkNode{
char data;
struct LinkNode* next;
} LNode ,*LinkList,*NodePtr;
//使用标头初始化链表
//return指向标头的指针
LinkList initLinkList()//初始化链表 带有标头
{
NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
tempHeader->data = '\0';
tempHeader->next = NULL;
return tempHeader;
}
void printList(NodePtr paraHeader)//打印链表的所有结点数据
{
NodePtr p = paraHeader->next;
while (p != NULL)
{
printf("%c", p->data);
p = p->next;
}
printf("\r\n");
}
//在尾部添加一个元素-尾插
//paraHeader列表的标头
//paraChar给定插入的字符
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;
}
//在给定位置插入元素
//paraHeader列表的标头
//paraChar给定的字符
//paraPosition给定的位置
void insertElement(NodePtr paraHeader, char paraChar, int Position)//指定位置插入
{
NodePtr p, q;
p = paraHeader;
for (int i = 0; i < Position; i++)
{
p = p->next;
if (p == NULL) {
printf("The position %d is beyond the scope of the list.", Position);
return;
}
}//找到位置
q = (NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
printf("linking\r\n");
q->next = p->next;
p->next = q;
}
//从列表中删除元素
//paraHeader列表的标头
//paraChar给定的字符
void deleteElement(NodePtr paraHeader, char paraChar)//删除指定字符
{
NodePtr q, p;
p = paraHeader;
while ((p->next != NULL) && (p->next->data != paraChar)) {
p = p->next;
}
if (p->next == NULL) {
printf("Can't delete %c\r\n", paraChar);
return ;
}
q = p->next;
p->next = p->next->next;
free(q);//删除这个结点
}
void appendInsertDeleteTest()//插入删除检测
{
LinkList tempList = initLinkList();//初始化一个空链表
printList(tempList);//打印创建的空链表
//插入
appendElement(tempList, 'H');
appendElement(tempList, 'e');
appendElement(tempList, 'l');
appendElement(tempList, 'l');
appendElement(tempList, 'o');
appendElement(tempList, 'K');
appendElement(tempList, 'i');
appendElement(tempList, 't');
appendElement(tempList, 't');
appendElement(tempList, 'y');
appendElement(tempList, '!');
printList(tempList);
//删除
deleteElement(tempList, 'b');
deleteElement(tempList, 'e');
deleteElement(tempList, '!');
printList(tempList);
//指定位置插入
insertElement(tempList, 'a', 5);
printList(tempList);
}
void basicAddressTest()//基本地址检测
{
LNode tempNode1, tempNode2;
tempNode1.data = 4;
tempNode1.next = NULL;
tempNode2.data = 6;
tempNode1.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);
}
void main()
{
appendInsertDeleteTest();
}
运行结果:
单链表一个结点包括---数据域和指针域,数据域存放自身数据,指针域存放下一个结点的地址,指向下一个结点,最后一个结点没有下一个结点可以指向,所以指向空-NULL。
代码中还有一种插入没有写出来---头插(当然还有有无头结点的头插,这里只写无头结点的头插
//无头结点将x插入第一个位置
x->next = head;
head = x;
//在p后插入其他结点x
x->next = p->next;
p->next = x;
心得体会:单链表是学很多其他数据结构的基础,虽然可以用数组模拟,但是其实用性和通用性比不上结构体链表,继续好好学吧!
草稿演示:
OK没有了。