#include<stdio.h>
#include<stdlib.h>
// int GetLength(DuLinkList L);
typedef int ElemType;
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior,*next;
}DuLNode,*DuLinkList;
/**
* @brief 初始化一个空的带头结点的双向链表
* @return DuLinkList 双向链表
*/
DuLinkList InitDuList(){
DuLinkList L = (DuLinkList)malloc(sizeof(DuLNode));
if(L == NULL){
printf("---Init failure---");
exit(1);
}
L->prior = NULL;
L->next = NULL;
return L;
}
/**
* @brief 插入结点
* @param L 双向链表
* @param length 插入的个数
*/
void InsertList(DuLinkList L,int length){
DuLinkList p = L;
for (int i = 0; i < length; i++) {
// 1.创建临时结点
DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode));
temp->next = NULL;
temp->prior = NULL;
temp->data = i;
// 2.为结点建立双向链表关系
// ①.temp是p的后继
p->next = temp;
// ②.temp的前驱是p
temp->prior = p;
// ③.记录最后的结点位置
p = temp;
}
}
/**
* @brief 指定[逻辑]位置插入结点
* @param L 双向链表
* @param index 逻辑位置
* @param elem 插入结点的值
*/
void InsertElem(DuLinkList L,int index,ElemType elem){
DuLinkList p = L;
// 判断插入位置
if(index < 1){
printf("InsertElem: index is illegal!\n");
exit(1);
}
// 新建结点
DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode));
temp->data = elem;
temp->prior = NULL;
temp->next = NULL;
// 查找index位置的结点
int i = 1;
for(i = 1;i < index&&p;i++){
p = p->next;
}
// 插入位置超过链表长度
if(p == NULL){
printf("InsertElem: index is more than LinkList!\n");
exit(1);
}
// 判断插入位置是否为链表尾部
if(p->next == NULL){
p->next = temp;
temp->prior = p;
}else{
p->next->prior = temp;
temp->next = p->next;
p->next = temp;
temp->prior = p;
}
}
/**
* @brief 删除指定[逻辑]位置的结点
* @param L 双向链表
* @param index 逻辑位置
* @param elem 待删结点的元素值
* @return int 返回待删结点的元素值类型
*/
int DeleteNode(DuLinkList L,int index,ElemType *elem){
DuLinkList p = L;
// 判断链表是否为空
if(L == NULL){
exit(1);
}
// 移动指针到待删结点之前
int k = 1;
while(k<index && p!=NULL){
p = p->next;
k++;
}
// 如果k>index或者p==NULL
if(k>index || p==NULL){
exit(1);
}
// 创建临时指针指向待删结点,并将待删结点的data赋值给*elem
DuLinkList delTemp = p->next;
*elem = delTemp->data;
// p->next等于待删结点的下一个结点
p->next = delTemp->next;
// 如果删除结点的下一个结点不为空,则将删除结点的前驱指向p
if(delTemp->next != NULL){
delTemp->next->prior = p;
}
// 释放delTemp结点
free(delTemp);
printf("Delete Node No.%d,it's data is %d!\n",index,*elem);
}
/**
* @brief 删除指定元素值的结点
* @param L 双向链表
* @param elem 元素值
*/
void DeleteVal(DuLinkList L,int elem){
DuLinkList p = L;
while(p){
// 判断结点的数据域与etlem是否相等
if(p->data == elem){
p->prior->next = p->next;
if(p->next != NULL)
p->next->prior = p->prior;
// 释放被删除结点
free(p);
break;
}
// 没有找到结点,继续移动指针
p = p->next;
}
}
/**
* @brief 遍历双向链表
* @param L 双向链表
*/
void Display(DuLinkList L){
DuLinkList s = L->next;
if(s == NULL)
printf("Display: LinkList is Null!\n");
else{
printf("Display: ");
while(s){
printf("%d ",s->data);
s = s->next;
}
printf("\n");
}
}
/**
* @brief Get the Element object 按位查找
* 根据逻辑位置的序号查找其元素值
* @param L 双向链表
* @param position 逻辑位置的序号
*/
void GetElement(DuLinkList L,int position){
int len = GetLength(L);
if(position<1 || position > len){
printf("GetElem: position error!\n");
}else{
int count = 0;
while(count < position){
L = L->next;
count++;
}
printf("GetElement: position %d's data is %d!\n",position,L->data);
}
}
/**
* @brief Get the Length object 获取双向链表的长度
* @param L 双向链表
* @return int 长度
*/
int GetLength(DuLinkList L){
int length = 0;
DuLinkList p = L->next;
while(p){
length++;
p = p->next;
}
return length;
}
int main(){
DuLinkList L = InitDuList();
int elem;
InsertList(L,3);
Display(L);
printf("length is: %d!\n",GetLength(L));
// DeleteNode(L,3,&elem);
// DeleteVal(L,1);
GetElement(L,2);
Display(L);
printf("length is: %d!\n",GetLength(L));
}
大家好,我是初学者,请问为什么我的程序中方法都没有做声明,然后只有GetLength这个方法提示我需要做声明呢。