读书人

链表删除有关问题

发布时间: 2012-07-28 12:25:13 作者: rapoo

链表删除问题

C/C++ code
# include <stdio.h># include <stdlib.h># include <malloc.h>struct Node{    int data;    struct Node * pNext;};struct Node * Greate_list(void);   //创建链表void Traversal_list(struct Node * pHead);  //遍历链表void delete_list(struct Node * pHead); //删除节点int main(void){    struct Node * pHead;  // 头指针    pHead = Greate_list();    //创建一个链表    Traversal_list(pHead);   //遍历一个链表    delete_list(pHead);   //删除节点    return 0;}struct Node * Greate_list(void)  //创建一个链表{    int i;    int len; //链表结点的个数    int value;  //存放临时结点的数据域    struct Node * head_node = (struct Node *)malloc(sizeof(struct Node)); //动态建造一个头结点    struct Node * interim_node;  //创建临时结点, 让其永远都指向尾结点    if (NULL == head_node)    {        printf("内存非配失败!");        exit (-1);    }    interim_node = head_node;  //让临时结点 指向 头结点    interim_node->pNext = NULL; // 头结点指针域为空(NULL)        printf("请输入要创建结点的个数: ");    scanf("%d", &len);    for (i = 0; i < len; i++)    {        printf("请输入第一个结点的值: ", i+1);        scanf("%d", &value);        struct Node * New = (struct Node *)malloc(sizeof(struct Node));  //动态的建造每一个结点        if (NULL == New)        {            printf("内存非配失败!");            exit (-1);        }                New->data = value;        interim_node->pNext = New;        New->pNext = NULL;        interim_node = New;    }    return head_node;}void Traversal_list(struct Node * pHead)   //遍历输出{    struct Node * p;    if (pHead->pNext == NULL)    {        printf("链表为空!\n");        exit (1);    }    p = pHead->pNext;    while (NULL != p)    {        printf("%d  ", p->data);        p = p->pNext;    }    printf("\n");    return;}void delete_list(struct Node * pHead){    int n;    struct Node *p ,*q;    p = pHead->pNext;    printf("输入要删除的元素: ");    scanf("%d", &n);     q=p;    while (p != NULL)    {        if (p->data == n)          {            q->pNext=p->pNext;            free(p);            Traversal_list(pHead);              return;        }        else        {            q=p;//可以记住需要删除的那个节点的前一个节点            p = p->pNext;        }    }    printf("抱歉,找不到你要删除的数字!\n");    return;}

输入 3
然后输入 1 2 3
然后提示printf("输入要删除的元素: ");
我输入 1 立即就出错,就是你如果删除别的节点正常,但删除第一个节点就出错了。


[解决办法]
探讨
C/C++ code
void delete_list(struct Node * pHead)
{
int n;
struct Node *p ,*q;


p = pHead->pNext;//应该改成p = pHead;


printf("输入要删除的元素: ");
scanf("%d", &n);

q=p;


[解决办法]
void delete_list(struct Node * pHead)
{
int n;
struct Node *p ,*q;
q = pHead;

p = pHead->pNext;
printf("输入要删除的元素: ");
scanf("%d", &n);

//q=p;

while (p != NULL)
{
if (p->data == n)
{
q->pNext=p->pNext;
free(p);
Traversal_list(pHead);
return;
}
else
{
q=p;//可以记住需要删除的那个节点的前一个节点
p = p->pNext;
}
}
printf("抱歉,找不到你要删除的数字!\n");
return;
}
[解决办法]
探讨
void delete_list(struct Node * pHead)
{
int n;
struct Node *p ,*q;


q = pHead;//应该是q指向头结点

p = pHead->pNext;//p指向q的下一个结点
printf("输入要删除的元素: ");
scanf("%d", &n);

//q=p;

while (p != NULL)
{……


[解决办法]
探讨

引用:
void delete_list(struct Node * pHead)
{
int n;
struct Node *p ,*q;
q = pHead;//应该是q指向头结点

p = pHead->pNext;//p指向q的下一个结点
printf("输入要删除的元素: ");
scanf("%d", &n);

//q=p;
……

读书人网 >C语言

热点推荐