先讲废话,再上代码。
顺序存储的链表在处理数据量变化较大时,会存在数组申请内存不够或申请内存过多而造成的浪费,因此我们需要一个可以即用即申,不用则直接释放内存的存储结构——链式存储。
- 创造并打印链表
#include <stdio.h> #include <stdlib.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; } //打印链表 void printList(NodePtr paraHeader){ NodePtr p = paraHeader->next; while (p) { printf("%c", p->data); p = p->next; } printf("\r\n"); }
2.插入
//将指定的paraChar加入到链表尾部 void appendElement(NodePtr paraHeader, char paraChar){ NodePtr p, q; //1.创造新结点存储指定数据 q = (NodePtr)malloc(sizeof(LNode)); q->data = paraChar; q->next = NULL; //注意这里一定要写否则会被系统判作野指针 //2.找到链表尾部 p = paraHeader; while (p->next) { p = p->next; } //3.把创造结点加入链表尾部 p->next = q; } //将指定元素加入到指定位置 void insertElement(NodePtr paraHeader, char paraChar, int paraPosition){ NodePtr p, q; //1.寻找目标位置 p = paraHeader; for (int i = 0; i < paraPosition; i++) { p = p->next; if (!p) { printf("The position %d is beyond the scope of the list.",paraPosition); return; } } //创造新结点存储指定数据 q = (NodePtr)malloc(sizeof(LNode)); q->data = paraChar; //3.连接 printf("linking\r\n"); q->next = p->next; p->next = q; //主要代码 }
3.删除
//删除一个指定元素值 void deleteElement(NodePtr paraHeader, char paraChar){ NodePtr p, q; p = paraHeader; //1.找到指定元素存在的位置的上一个结点,方便删除 while (p->next&&(p->next->data != paraChar)) { p = p->next; } if (!p->next) { printf("Cannot delete %c\r\n", paraChar); return; } //2.删除 q = p->next; p->next = p->next->next; free(q); //释放该结点 }
4.测试
//测试 void appendInsertDeleteTest(){ //1.创造一个空链表 LinkList tempList = initLinkList(); printList(tempList); //2.加入一些字符 appendElement(tempList, 'H'); appendElement(tempList, 'e'); appendElement(tempList, 'l'); appendElement(tempList, 'l'); appendElement(tempList, 'o'); appendElement(tempList, '!'); printList(tempList); //3.删除一些数据 deleteElement(tempList, 'e'); deleteElement(tempList, 'a'); deleteElement(tempList, 'o'); printList(tempList); //4.加入数据到指定位置 insertElement(tempList, 'o', 1); printList(tempList); } //地址测试 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; }
5.主函数
//主函数 int main(){ appendInsertDeleteTest(); }
6.测试结果