2.3节双链表作业
#include stdio.h #include malloc.h //双向链表存的是字符 typedef struct doublelinkednode{ char data; struct doublelinkednode *previous; struct doublelinkednode *next; } dlnode, *dlnodeptr; //初始化链表创建头结点 //return 头结点指针 dlnodeptr initLinkList(){ dlnodeptr tempHeader (dlnodeptr)malloc(sizeof(struct doublelinkednode)); tempHeader-data \0; tempHeader-previous NULL; tempHeader-next NULL; return tempHeader; }// 初始化链表 //打印链表中的所有字符 param paraHeader 链表头结点 void printList(dlnodeptr paraHeader){ dlnodeptr p paraHeader-next; while (p ! NULL) { printf(%c, p-data); p p-next; }// 循环打印 printf(\r\n); }// 打印链表 /** * 在指定位置插入一个字符 * param paraHeader 链表头结点 * param paraChar 要插入的字符 * param paraPosition 插入位置0表示第一个位置 */ void insertElement(dlnodeptr paraHeader, char paraChar, int paraPosition){ dlnodeptr p, q, r; // 第一步找到要插入的位置 p paraHeader; for (int i 0; i paraPosition; i ) { p p-next; if (p NULL) { printf(位置 %d 超出链表范围\n, paraPosition); return; }// 超出范围就返回 } // 循环找位置 // 第二步创建新结点 q (dlnodeptr)malloc(sizeof(struct doublelinkednode)); q-data paraChar; // 第三步连接前后结点双向链接 r p-next; q-next p-next; // 新结点的下一个指向原来的下一个 q-previous p; // 新结点的上一个指向当前结点 p-next q; // 当前结点的下一个指向新结点 if (r ! NULL) { r-previous q; // 原来的下一个结点的上一个指向新结点 }// 如果后面还有结点也要连接回来 }// 插入元素 /** * 删除链表中第一个出现的指定字符 * param paraHeader 链表头结点 * param paraChar 要删除的字符 */ void deleteElement(dlnodeptr paraHeader, char paraChar){ dlnodeptr p, q, r; p paraHeader; // 第一步找到要删除的字符 while ((p-next ! NULL) (p-next-data ! paraChar)){ p p-next; }// 一直找直到找到或者到末尾 // 第二步没找到就报错 if (p-next NULL) { printf(字符 %c 不存在\n, paraChar); return; }// 没找到直接返回 // 第三步修改指针跳过要删除的结点 q p-next; // q就是要删除的结点 r q-next; // r是要删除的后面的结点 p-next r; // 前面结点的下一个指向后面的结点 if (r ! NULL) { r-previous p; // 后面结点的上一个指向前面的结点 }// 如果后面有结点也要连回来 // 第四步释放内存 free(q); }// 删除元素 //测试插入和删除功能 void insertDeleteTest(){ // 第一步初始化空链表 dlnodeptr tempList initLinkList(); printList(tempList); // 第二步插入一些字符 insertElement(tempList, H, 0); insertElement(tempList, e, 1); insertElement(tempList, l, 2); insertElement(tempList, l, 3); insertElement(tempList, o, 4); insertElement(tempList, !, 5); printList(tempList); // 第三步删除一些字符 deleteElement(tempList, e); deleteElement(tempList, a); deleteElement(tempList, o); printList(tempList); // 第四步在指定位置插入字符 insertElement(tempList, o, 1); printList(tempList); }// 插入删除测试 //地址测试 void basicAddressTest(){ dlnode tempNode1, tempNode2; tempNode1.data 4; tempNode1.next NULL; tempNode2.data 6; tempNode2.next NULL; printf(第一个结点地址%ddata地址%dnext地址%d\r\n, tempNode1, tempNode1.data, tempNode1.next); printf(第二个结点地址%ddata地址%dnext地址%d\r\n, tempNode2, tempNode2.data, tempNode2.next); tempNode1.next tempNode2; // 让第一个结点指向第二个 }// 地址测试 void main(){ insertDeleteTest(); basicAddressTest(); }