好吧!最近有朋友用Vc去free()分配的空间的时候,老是在最后的输出时有警告,然后我就去搜了一下,原因应该如下(转):
malloc了一个大小为sizeof(A)的空间,而分配后,会在第sizeof(A)+1个位置上写一个特殊数据,来表示分配的这段空间的结束。所以,如果这个位置被覆盖,则这个结束标志位被擦除,导致free时会出错!!!
数据结构上机实验写的,发上小博客去。。。
前提(创建结构体):
typedef struct student{
int data;
int length;
struct student *next;
}LNode, *LinkList;
单链表的创建(后插法):
LinkList endcreat(int n){//定义结构体指针类型
LinkList L, p, q;
L = (LNode *)malloc(sizeof(LNode));
if(!L)
return 0;
L->next = NULL;
q = L;
for(int i=1; i<=n; ++i){
p = (LNode *)malloc(sizeof(LNode));
scanf("%d", &(p->data));
p->next = NULL;//后插(主要代码)
q->next = p;
q = p;
}
return L;//返回头指针
}
单链表的创建(前插法):
LinkList firstcreat(int n)
{
LinkList L, q, p;
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
q = L;
for(int i=0; i<n; ++i)
{
p = (LNode *)malloc(sizeof(LNode));
cin >> p->data;
p->next = q->next;//前插(主要代码)
q->next = p;
}
return L;//返回头结点
}
输出单链表:
void print(LinkList head){
LinkList p = head->next;
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
}
单链表的按值查找(取e值)
//线性表L中查找e的数据元素,成功返回数据元素的位置序号,失败返回-1
int Find(LinkList L, int e)
{
LinkList p;
int j=0;
p = L;
while(p && p->data != e)
{
p = p->next;
j++;
}
if(p) //此处可直接返回p(即返回值为e的结点地址p,查找失败p为NULL)
return j;
else
return -1;
}
单链表的取值(取第i个元素的数据域,并用e返回)
int Getleem(LinkList L, int i, int &e)
{//在带头结点的单链表L中根据序号i获取元素的值,用e返回L中第i个数据元素的值
LinkList p;
p = L->next;
int j=1;
while(p && j<i)//找到i为止
{
p = p->next;
j++;
}
if(!p || j>i)//i值不合法
return 0;
else
{
e = p->data;//返回第i个结点的数据域
return e;
}
}
单链表的插入:
(核心操作)
s->next = p->next; p->next = s;
(函数代码)
int ListInsert(LinkList &L, int i, int e)
{//在带头结点的单链表L中第i个位置插入值为e的新结点。
LinkList p;
p = L;
int j=0;
while(p && j<(i-1))//查找第i-1个结点,p指向该结点
{
p = p->next;
j++;
}
if(!p || j>i-1)
return 0;
LinkList s = new LNode; // 该式与 LinkList s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
单链表的删除:(可用于清空单链表)
(核心代码)
p->next = p->next -> next;
函数代码:
int ListDelete(LinkList &L, int i)
{
LinkList p;
p = L;
int j=0;
while(p->next && (j<i-1))
{
p = p->next;
j++;
}
if(!p || j>i-1)
return 0;
LinkList q = p->next;
p->next = q->next;
delete q; //这里等于free(q);
return 1;
}
Psl: 这里声明一下,因为我前面用了new;创建结点, 所以删除用delete;(如果你是用malloc()申请结点的话,那么对应释放的函数是free()),必须一一对应。
发现一个东西 system(“cls”); 这个东西清屏的意思。