#include
#include
#include
typedef int DataType;
typedef struct Node {
DataType data; // 数据元素
Node* next; //后继结点指针
}Node;
Node* CreatList(DataType a[], int n)//尾插法建立链表
{
Node* first = NULL, * rear = NULL,*s=NULL;
first = (Node*)malloc(sizeof(Node));
rear = first;
for (int i = 0; i < n; i++)
{
s = (Node*)malloc(sizeof(Node));
s->data = a[i];
rear->next = s;
rear = s;
}
rear->next = NULL;
return first;
}
int Insert(Node* first, int i, DataType x)//按位插入
{
Node* rear = first;
for (int a = 0; a < i - 1; a++)
{
if (rear == NULL)
{
printf("位置错误,插入失败\n");
return 0;
}
else
rear = rear->next;//找到第i-1位
}
Node* s = (Node*)malloc(sizeof(Node));
s->data = x;
s->next = rear->next;
rear->next = s;
return 1;
}
int Insert2(Node* first, DataType x)//按值插入,递增有序
{
Node* rear = first->next;
if (rear == NULL)
{
printf("空表,插入失败\n");
return 0;
}
Node* p = first;//用于保存rear之前的一个结点
while (rear->data <= x)
{
if (rear->next == NULL)
{
p = rear;
break;
}
else
{
p = rear;
rear = rear->next;
}
}//跳出循环时即rear->data>x或者x大于所有结点的数据
Node* s = (Node*)malloc(sizeof(Node));
s->data = x;
s->next = p->next;
p->next = s;
return 1;
}
int Delete(Node* first, int i, DataType* ptr)//按位删除
{
Node* p = first, * q = NULL; int count = 0;
while (p != NULL && count < i - 1)
{
p = p->next;
count++;
}
if (p == NULL || p->next == NULL)
{
printf("位置错误,删除失败\n ");
return 0;
}
else
{
q = p->next;
*ptr = q->data;
p->next = q->next;
free(q);
return 1;
}
}
int Delete2(Node* first, DataType x)//按值删除
{
Node*space=NULL,*rear=first->next;
Node* p = first;
int count = 0;
while (rear!= NULL)
{
if (rear->data == x)
{
space = rear;
p->next = rear->next;
rear = rear->next;
free(space);
count++;
}
else
{
p = rear;//rear之前的结点
rear = rear->next;
}
}
if (count == 0)
{
printf("删除失败\n");
return 0;
}
else
return 1;
}
void PrintList(Node* first)//遍历输出
{
int count = 0;
Node* p = first->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
count++;
}
if (count == 0)
printf("表已销毁,没有输出\n");
else
printf("\n");
}
void DestroyList(Node* first)//单链表的销毁
{
Node* p = first->next;
Node* space = NULL;
while (p != NULL)
{
space = p;
p = p->next;
free(space);
}
}
int main()
{
int a[9] = { 1,2,3,4,5,6,7,8,9 };
int n = 9;
int p=0;
Node *list=CreatList(a, n);
PrintList(list);
Insert2(list, 11);
PrintList(list);
Insert(list, 11, 99);
PrintList(list);
Insert(list, 4, 88);
PrintList(list);
Delete(list, 3, &p);
PrintList(list);
Delete2(list, 9);
PrintList(list);
DestroyList(list);
PrintList(list);
return 0;
}
如上代码,在输出时显示了异常,说引发了异常: 读取访问权限冲突。
p 是 0xD。求问为什么会这样,怎么改啊