首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

简单链表,段异常

2012-06-08 
简单链表,段错误链表中插入数据,提示段错误,实在看不出来哪里错了,程序如下:C/C++ code#includestdlib.h

简单链表,段错误
链表中插入数据,提示段错误,实在看不出来哪里错了,程序如下:

C/C++ code
#include<stdlib.h>struct Node{    struct Node* next;    dt data;};typedef struct Node* list;typedef struct Node* pnode;typedef int dt;int make_list(list l)//初始化链表{    l = (list)malloc(sizeof(node));    if(l==NULL)    {        return 0;    }    l->next = NULL;    return 1;}pnode insert_item(dt x,pnode p,list l)//节点p后插入数据x的新节点,并返回此节点{    pnode np = (pnode)malloc(sizeof(node));    if(np!=NULL)    {        np->data = x;        np->next = p->next;        p->next = np;//[color=#FF0000]此行中断,显示段错误[/color]    }    return np;}int main(){    list l;    make_list(l);    insert_item(5,l,l);    return 0;}


如上,红色字体处发生错误,请问为什么?该如何修改。

[解决办法]
你l指针没初始化就开始用了,我感觉你的代码很乱,好好学学数据结构吧!
我把链表的一系列操作都给你吧。
C/C++ code
#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define TRUE 1#define FALSE 0typedef struct Node{    int date;    struct Node *pNext;}NODE, *PNODE;PNODE CreatList(PNODE Head);void TraversList(PNODE pHead);int ListLength(PNODE pHead);void Sortlist(PNODE pHead);int InsertNode(PNODE pHead);int DeleteNode(PNODE pHead);int ClearList(PNODE Head);        /* 清理整个链表,除了头结点外,其他节点通通删除 */int DestroyList(PNODE Head);    /* 销毁整个链表,包含头结点一块删除,这样如果要插入节点,就要重新建立链表,而清理不需要*/int main(void){    PNODE Head = NULL;     Head = CreatList(Head);    TraversList(Head);    DestroyList(Head);    Head = CreatList(Head);    TraversList(Head);    InsertNode(Head);    TraversList(Head);}PNODE CreatList(PNODE Head){    PNODE pNew, temp;    int i, n;    Head = (PNODE)malloc(sizeof(NODE));     temp = Head;    temp->pNext = NULL;    printf("请输入建立链表的节点数:");    scanf("%d", &n);    for (i = 0; i < n; i++)    {        pNew = (PNODE)malloc(sizeof(NODE));        scanf("%d", &pNew->date);        temp->pNext = pNew;        temp = pNew;        temp->pNext = NULL;    }    return Head;}int ListLength(PNODE pHead){    int i = 0;    PNODE p = pHead->pNext;    /* 如果把头节点算在链表里面的话就用p = pHead */    while(p != NULL)    {        i++;        p = p->pNext;    }    return i;}void TraversList(PNODE pHead){    PNODE p = pHead->pNext;    while (p != NULL)    {        printf("%d ", p->date);        p = p->pNext;    }    printf("\n");}void Sortlist(PNODE pHead){    int i,j,t;    int len = ListLength(pHead);    PNODE p,q;    p = pHead;    for (i = 0,p = p->pNext; i < len - 1;i++,p = p->pNext)    {        for (j = i + 1,q = p->pNext; j < len; j++,q = q->pNext)        {            if (p->date > q->date)        /* 类似于数组中的a[i] > a[j]*/            {                t = p->date;                p->date = q->date;                q->date = t;            }        }    }}int InsertNode(PNODE pHead){    int num, val, i;    PNODE q = NULL;    PNODE p = pHead;    PNODE pNew = (PNODE)malloc(sizeof(NODE));    num = val = 0;    printf("请输入要插入节点的位置:");    scanf("%d", &num);    if (num < 1 || num > ListLength(pHead) + 1)    {        printf("插入位置不对,插入失败!\n");        return FALSE;    }    else    {        printf("请输入要插入节点的值:");        scanf("%d", &val);        for (i = 1; i < num; i++)        {            p = p->pNext;        }        pNew->date = val;        //    PNODE q = p;            q = p->pNext;        p->pNext = pNew;        pNew->pNext = q;        //    pNew->pNext = q->pNext;/* 这个时候的p->pNext已经变了变成pNew本身了 */    }    return TRUE;}int DeleteNode(PNODE pHead){    int num, i;    PNODE p = pHead;    PNODE q;    num = 0;    if (NULL == pHead->pNext)    {        printf("链表为空,不能删除节点!\n");        return FALSE;    }    else    {        printf("请输入要删除节点的位置:");        scanf("%d", &num);        if (num < 1 || num > ListLength(pHead))        {            printf("删除的节点不合法!\n");            return FALSE;        }        else        {            for (i = 0; i < num - 1; i++)            {                p = p->pNext;            }            /* q是指向要被释放的节点,删掉一个节点必须知道这个节点的前一节点和后一节点的情况*/            q = p->pNext;            p->pNext = q->pNext;            free(q);        }    }    return TRUE;}int ClearList(PNODE Head){    PNODE p = Head->pNext;    while(p)    {        Head->pNext = p->pNext;        free(p);        p = Head->pNext;    }    return TRUE;}int DestroyList(PNODE Head){    PNODE p = Head;    while (p)    {        Head = p->pNext;        free(p);        p = Head;    }    return TRUE;} 

热点排行