执行完以下代码后程序直接全部退出是咋回事,以下代码为自建函数。
bool Delete_List(LinkList &L,int n)
{
LinkList p,q;
if(L==NULL||L->next==NULL) //链表本身要存在
{
printf("链表不存在或者链表不能删除");
return false;
}
p=Locate_Find_List(L,n-1);
if(p==NULL||p->next==NULL) //判断P是否赋值成功
{
printf("未查找到第%d个位置",n);
return false;
}
else
{
q=p->next; //将p->next的地址给q
p->next=q->next;
free(q); //删除q节点
printf("删除成功!");
return true;
}
}
调试方式运行程序,出错了会停留在报错的行,检查对应的指针变量。还有free是不是重复释放
代码(C语言)双向链式线性表 Visual Studio 2019
/**
* 数据结构 C语言 双向链式线性表
* @FileName Dual_LinkedList.c
* @author W.Lionel.Esaka
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
enum status {
Error = 0,
Corrrect = 1,
Overflow = -1
};
enum status Status;
typedef char ElemType;
typedef struct DualList {
ElemType data;
struct DualList* Previous;
struct DualList* Next;
}DualNode, * DualLinkList;
/*创建指定长度链表 尾插法*/
//如果链表为空,则创建一个链表,指针域指向自己
void ListInit(DualNode** p,int Number)
{
DualNode* temp;
DualNode* target;
int i;
printf("输入节点的值,输入0结束\n");
for (i = 0; i < Number; i++)
{
if (*p == NULL) //如果输入的链表是空。则创建一个新的节点,使其next指针指向自己 (*head)->next=*head;
{
*p = (DualNode*)malloc(sizeof(DualNode));
if (!*p) exit(0);
(*p)->data = (char)(i + 65);
(*p)->Next = *p;
(*p)->Previous = *p;
}
else
{
for (target = *p; target->Next != *p; target = target->Next);//寻找尾节点
temp = (DualNode*)malloc(sizeof(DualNode));
if (!temp)exit(0);
temp->data = (char)(i + 65);
temp->Next = *p; //新节点指向头节点
(*p)->Previous = temp;
target->Next = temp; //尾节点指向新节点
temp->Previous = target;
}
}
}
/*插入元素*/
void ListInsert(DualNode** list, int Position)
{
DualNode* p, * target, * temp;
int i;
ElemType item;
printf("请输入所要插入的数据:\n");
scanf("%d", &item);
fflush(stdin);
if (Position == 1)
{
temp = (DualNode*)malloc(sizeof(DualNode));
if (!(temp))
return Error;
temp->data = item;
for (target = (*list); target->Next != (*list); target = target->Next);
temp->Next = (*list);
target->Next = temp;
(*list)->Previous = temp;
(*list) = temp;
}
else
{
target = (*list);
for (i = 1; i < (Position - 1); i++)
{
target = target->Next;
}
temp = (DualNode*)malloc(sizeof(DualNode));
if (!(temp))
return Error;
temp->data = item;
p = target->Next;
target->Next = temp;
temp->Next = p;
p->Previous = temp;
temp->Previous = target;
}
}
/*删除元素*/
void ListDelete(DualNode** list, int Position)
{
DualNode* temp, * target;
int i = 1;
if (Position == 1)
{
for (target = (*list); target->Next != (*list); target = target->Next);
temp = *list;
(*list) = (*list)->Next;
target->Next = (*list);
(*list)->Previous = target;
free(temp);
}
else
{ //删除其他节点
for (i = 1, target = *list; target->Next != *list && i != Position - 1; target = target->Next, i++);
if (target->Next == *list)
{
for (target = *list; target->Next->Next != *list; target = target->Next);
temp = target->Next;
target->Next = *list;
(*list)->Previous = target;
free(temp);
}
else
{
temp = target->Next;
target->Next = temp->Next;
temp->Next->Previous = target;
free(temp);
}
}
}
/*查找元素*/
int ListSearch(DualNode* list, int Elem)
{
DualNode* target;
int i = 1;
for (target = list; target->data != Elem && target->Next != list; i++)
{
target = target->Next;
}
if (target->Next == list && target->data != list->data)
{
return Error;
}
return i;
}
/*遍历链表 正序*/
void ListDisplayForward(DualNode* list)
{
DualNode* target;
target = list;
do {
printf("%c\t", target->data);
target = target->Next;
} while (target != list);
printf("\n\n");
}
/*遍历链表 逆序*/
void ListDisplayBackward(DualNode* list)
{
DualNode* target;
target = list->Previous;
do {
printf("%c\t", target->data);
target = target->Previous;
} while (target != list->Previous);
printf("\n\n");
}
/*字母表给定顺序输出*/
void ListDisplayAlphabet(DualNode* list, int Position)
{
DualNode* target;
target = list;
int i = 0;
if (Position > 0)
{
for(i = 1; i <= Position;i++)
target = target->Next;
}
if (Position < 0)
{
i = abs(Position);
for (i = 1; i <=abs(Position); i++)
{
target = target->Previous;
}
}
i = 1;
do {
printf("%c\t", target->data);
target = target->Next;
i++;
} while (i <= 26);
printf("\n\n");
}
/*入口*/
void main()
{
DualNode* list = NULL;
ListInit(&list, 26);
ListDisplayForward(list);
ListDisplayBackward(list);
/* ListInsert(&list, 5);
ListInsert(&list, 6);
ListDisplayForward(list);
ListDisplayBackward(list);
ListDelete(&list, 5);
ListDelete(&list, 6);
ListDisplayForward(list);
ListDisplayBackward(list);*/
ListDisplayAlphabet(list, 52);
ListDisplayAlphabet(list, 3);
ListDisplayAlphabet(list, -3);
}