目录
一、老师部分
1.完整代码
#include <stdio.h>
#include <malloc.h>
typedef struct DoubleLinkedNode{
char data; //数据域
struct DoubleLinkedNode *previous;
struct DoubleLinkedNode *next; //指针域
}DLNode,*DLNodePtr;
DLNodePtr initLinkList(){
DLNodePtr tempHeader = (DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
tempHeader->data = '\0';
tempHeader->previous = NULL;
tempHeader->next = NULL; //初始化链表
return tempHeader;
}
void printList(DLNodePtr paraHeader){
DLNodePtr p = paraHeader->next;
while(p !=NULL){
printf("%c",p->data);
p = p->next;
}
printf("\r\n"); //打印链表
}
void insertElement(DLNodePtr paraHeader,char paraChar,int paraPosition){
DLNodePtr p,q,r;
//第一步:找位置
p = paraHeader;
int i;
for(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 = (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;
} //插入元素
}
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("The char '%c' does not exist.\r\n",paraChar);
return;
}
//第三步:改变连接
q = p->next;
r = q->next;
p->next = r;
if(r!= NULL){
r->previous = q;
}
//第四步:释放内存
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("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;
}
void main(){
insertDeleteTest();
basicAddressTest();
}
2.运行结果
二、 自己部分
1.双向链表定义
双向链表顾名思义,就是由单向的链变成双向链,在单链表中,我们有一个数据域,还有一个指针域,数据域用来存储相关数据,而指针域则负责链表之间的“联系”。 而在双向链表中,我们需要有两个指针域,一个负责向后连接,一个负责向前连接。
2.函数实现
DLNodePtr locateElement(DLNodePtr paraHeader,char paraChar) {
DLNodePtr p = paraHeader;
while((p->next!=NULL) && (p->next->data!=paraChar)){
p = p->next;
}
if(p->next == NULL){
printf("The char '%d' does not exist",paraChar);
return NULL;
}
return p;
}
3.函数测试
void locateElementTest(){
DLNodePtr tempList = initLinkList();
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);
DLNodePtr newList = locateElement(tempList, 'e');
if (newList != NULL) {
printList(newList);
}
newList = locateElement(tempList, 'a');
if (newList != NULL) {
printList(newList);
}
newList = locateElement(tempList, 'o');
if (newList != NULL) {
printList(newList);
}
}
4.完整代码
#include <stdio.h>
#include <malloc.h>
typedef struct DoubleLinkedNode{
char data; //数据域
struct DoubleLinkedNode *previous;
struct DoubleLinkedNode *next; //指针域
}DLNode,*DLNodePtr;
DLNodePtr initLinkList(){
DLNodePtr tempHeader = (DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
tempHeader->data = '\0';
tempHeader->previous = NULL;
tempHeader->next = NULL; //初始化链表
return tempHeader;
}
void printList(DLNodePtr paraHeader){
DLNodePtr p = paraHeader->next;
while(p !=NULL){
printf("%c",p->data);
p = p->next;
}
printf("\r\n"); //打印链表
}
void insertElement(DLNodePtr paraHeader,char paraChar,int paraPosition){
DLNodePtr p,q,r;
//第一步:找位置
p = paraHeader;
int i;
for(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 = (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;
} //插入元素
}
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("The char '%c' does not exist.\r\n",paraChar);
return;
}
//第三步:改变连接
q = p->next;
r = q->next;
p->next = r;
if(r!= NULL){
r->previous = q;
}
//第四步:释放内存
free(q);
}//删除元素
DLNodePtr locateElement(DLNodePtr paraHeader,char paraChar) {
DLNodePtr p = paraHeader;
while((p->next!=NULL) && (p->next->data!=paraChar)){
p = p->next;
}
if(p->next == NULL){
printf("The char '%c' does not exist",paraChar);
return NULL;
}
return p;
}
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 locateElementTest(){
DLNodePtr tempList = initLinkList();
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);
DLNodePtr newList = locateElement(tempList, 'e');
if (newList != NULL) {
printList(newList);
}
newList = locateElement(tempList, 'a');
if (newList != NULL) {
printList(newList);
}
newList = locateElement(tempList, 'o');
if (newList != NULL) {
printList(newList);
}
}
void basicAddressTest(){
DLNode 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;
}
int main(){
insertDeleteTest();
basicAddressTest();
locateElementTest();
return 0;
}
5.运行结果