#include<stdio.h>
#include<stdlib.h>
struct Node
{
int info;
struct Node *link;
};
typedef struct Node * LinkList;/*单链表类型*/
//头插法建立单链表
LinkList createNullList() {
int x;
char str;
LinkList _list = (LinkList)malloc(sizeof(struct Node));/*表头节点空间*/
if (_list != NULL)//如果内存不足,将null
_list->link = NULL;//设置为空链表
while (scanf_s("%d", &x) != EOF)//while(scanf("%d",&x) != EOF) (str = getchar()) != '\n'或者可以用这个
{
//LinkList llist = (LinkList)malloc(sizeof(Pnode));
LinkList llist = (LinkList)malloc(sizeof(struct Node));
llist->info = x;
llist->link=_list->link;
_list->link = llist;
}
return _list;
}
//尾插法建立单链表(l会随着新节点产生下移)
LinkList createNullList2() {
int x;
LinkList _list = (LinkList)malloc(sizeof(struct Node));/*表头节点空间*/
_list->link = NULL;
LinkList l;
l = _list;
while (scanf_s("%d",&x)!=EOF)
{
LinkList llist = (LinkList)malloc(sizeof(struct Node));
llist->info = x;
l->link = llist;
l = llist;
}
l->link = NULL;
return _list;
}
//单链表的增删改查操作
LinkList Insert(LinkList L, int i, int x) {
//先找到要加入的节点的前驱节点
int z;
LinkList p ;
p = L;
for (z = 1; z < i; z++) {
p = p->link;
}
//再创建新节点,换一下指针域
LinkList n = (LinkList)malloc(sizeof(struct Node));
n->info = x;
n->link = p->link;
p->link = n;
return L;
}
LinkList LinkedListDelete(LinkList L, int x)
{
int z;
LinkList p,q;
q = L;
//pre为前驱结点,p为查找的结点。
p = L->link;
while (p->info!= x) //查找值为x的元素
{
q = p;
p = p->link;
}
q->link = p->link;//删除操作,将其前驱next指向其后继。
p->link = NULL;
free(p);
return L;
}
//LinkList Delet(LinkList L, int i,int x) {
// //删除值为x的节点,或者第几个节点
// //先找到要删除的节点和前驱节点
// int z;
// Pnode p,q;
// p = L;
// q = L;
// if (i != NULL) {
// for (z = 1; z < i; z++) {
// q = p;
// p = p->link;
// }
// q->link = p->link;
// free(p);
// }
// if (x != NULL) {
// while (p->info!=x)
// {
// q = p;
// p = p->link;
// }
// q->link = p->link;
// free(p);
// }
// return L;
//}
void main() {
LinkList ll = createNullList();
//测试添加
ll = Insert(ll, 4, 9);
//ll = Delet(ll,NULL,2);
ll = LinkedListDelete(ll,2);
for (ll = ll->link; ll != NULL; ll = ll->link) {
printf("%d", ll->info);
}
}
没错,就是这里
//LinkList llist = (LinkList)malloc(sizeof(Pnode));
LinkList llist = (LinkList)malloc(sizeof(struct Node));
!!!
heap corruption detected:after normal block(#xxx) at 0x xxxxxxxx
crt detected that the application wrote to menory after end of heap buffer
这是典型的内存溢出错误,常在内存的delete处发生,而且一般在debug版本中可能出现,release版本中可能并不报错.
出现这个错误的原因一般都是操作new申请的内存溢出,因为在c++中,如果用new分配一段内存,操作的时候改变了该部分的大小,在delete时就会出错.比如说如下部分:
char* p=new char[5];
strcpy(p,“aaaaa”);
delete[] p;
这段代码就会出错,因为申请了一个size为5的内存,但是strcpy过去了一个size为6的字符串,因此破坏了这个指针,运行debug版本的时候就会出现先前的错误,但是在release版本中,溢出一个字节的内存很有可能是没有错误的,然后潜在的隐患是肯定存在的,因此,我们在debug遇到这样的错误时候一定要仔细检查对new出的指针的操作.
!!!
结构申请空间的时候别把
p =(struct student *)malloc(sizeof(struct student));
写成
p =(struct student *)malloc(sizeof(struct student *));
!!!
C语言释放链表时的问题
http://zhidao.baidu.com/question/38250738
current = head;
while (current != NULL)
{
free(current);
current=current->next;
}
改为
//释放字符子串链表空间
current = head;
while (current != NULL)
{
temp=current;
current=current->next;
free(temp);
}