这个在删除头结点的时候没有考虑头结点后指针为空的情况(就是那个把*pHead打出来的操作)。当然这是测试代码,无关紧要。。。
因为LZ很多东西都没有给,所以我进行了一些补全,并且写了测试代码,LZ的删除代码我没有动,然后进行了如下测试,结果正常。。。求LZ的测试过程以及其他代码。。LZ啊,很多代码都没有,我连你觉得那里不正常都看不出来啊。。。
#include
#include
#include
typedef struct
{
int id;
char com_name[10];
}DATA;
typedef struct Node
{
DATA data;
struct Node * pNext;
}NODE,*PNODE;
int Delete_list(PNODE * pHead,int id)
{
PNODE p,q;
p = *pHead;
if (p->data.id == id)
{
*pHead = p->pNext;
printf ("%s <-------------1\n",p->data.com_name); //看看头结点里面的值 是apple
free (p);
printf ("%s <-------------2\n",(*pHead)->data.com_name); //头结点被释放了 再 看看里面的值就段错误了 应该显示的是banana
p = NULL;
return 0;
}
for (; p; q = p, p = p->pNext )
{
if (p->data.id == id)
{
q->pNext = p->pNext;
free(p);
p = NULL;
return 0;
}
}
return -1;
}
int Insert_list(PNODE * pHead,int id,char * name)
{
PNODE p;
for(p=*pHead;p->pNext;p=p->pNext);
p->pNext = (PNODE)malloc(sizeof(Node));
p->pNext->data.id = id;
p->pNext->pNext = NULL;
strcpy((char*)p->pNext->data.com_name,name);
return 1;
}
int main()
{
Node * list = (PNODE)malloc(sizeof(Node));
strcpy(list->data.com_name,"apple");
list->data.id = 1;
list->pNext = NULL;
Insert_list((&list),2,"banana");
Delete_list((&list),1);
return 0;
}
for (; p; q = p, p = p->pNext )
{
if (p->data.id == id)
{
q->pNext = p->pNext;
free(p);
p = NULL;
return 0;
}
这一段就是删除程序了,你前面是在搞什么,而且如果加上前面,该函数返回值可能有2个,你自己再看看