简单链表,段错误
链表中插入数据,提示段错误,实在看不出来哪里错了,程序如下:
#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;}#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;}