
最终导致你程序出错是这几句话:
p=q=L.head
…
creatlist(&p)
…
travel(L.head,L.length)
L.head没有被赋值,就去遍历访问,导致野指针,内存出错。
正确的做法是:
...
for(i=0i<ni++)
{
creatlist(&p)
if (L.head == NULL)
{
L.head = p
}
else
{
q->next=p
}
q = p
}
其他还有好多细小的问题,就不一一给你指出了。
LinkList LInitList(L)
InitList(L)中的L是形参传递
改成全局变量就行了
#include<iostream>
#include<malloc.h>
#include<stdio.h>
using namespace std
typedef int ElemType
typedef struct Node//链表类型定义
{
ElemType data
Node *next
}Node,*LinkList
LinkList L
void InitList(LinkList L)//建立头节点
{
L=(LinkList)malloc(sizeof(Node))
L->next=NULL
}
void CreateFromHead(LinkList L)//头插法建表
{
cout<<"建立单链表"<<endl
Node *s
char c
int flag=1,i=-1,d
while(flag)
{
i=i+1
cout<<"第"<<i<<"个节点的数据域的值是:"
cin>>d
if(d!=0)
{
s=(Node*)malloc(sizeof(Node))
s->data=d
s->next=L->next
L->next=s
}
else
flag=0
}
}
void main()
{
InitList(L)
CreateFromHead(L)
}
或者定义二级指针指向L
#include<stdio.h>#include<malloc.h>
typedef struct stackNode{
int data
struct stackNode * next
}LinkNode,* LinkList
//初始化带头节点的单链表
void InitList(LinkList * L)
{
*L = (LinkList)malloc(sizeof(LinkNode))
(*L)->next = NULL
}
//单链表中插入数值
void InsertList(LinkList L)
{
LinkNode * Node
LinkNode * p = L
LinkNode *pre
Node = (LinkNode*)malloc(sizeof(LinkNode))
Node->next = NULL
printf("\n请输入您要插入的数据:")
scanf("%d",&Node->data)
while( p != NULL &&p->data <= Node->data)
{
pre = p
p = p->next
}
Node->next = p
pre->next = Node
printf("\n插入成功!")
}
//删除单链表元素
void DelList(LinkList L)
{
LinkNode * p = L
LinkNode * pre
int value
printf("\n请输入您要删除的数据:")
scanf("%d",&value)
while(p != NULL &&p->data != value)
{
pre = p
p = p->next
}
if(p == NULL)
printf("Did not find %d!\n",value)
else
{
pre->next = p->next
free(p)
printf("\n删除成功!")
}
}
//打印单链表
void Print(LinkList L)
{
LinkNode *p = L->next
while(p != NULL)
{
printf("%-4d",p->data)
p = p->next
}
printf("\n")
}
//菜单
void menu(LinkList L)
{
char ch
do{
system("cls")
printf("----------------菜单---------------\n")
printf(" 1.插入一个节点\n")
printf(" 2.删除一个节点\n")
printf(" 3.打印单链表\n")
printf(" 4.推出程序\n\n")
printf("请输入您要进行的 *** 作:")
ch = getch()
if(ch >='1' &&ch<'5')
{
printf("%c\n",ch)
getch()
switch(ch)
{
case '1':
InsertList(L)
break
case '2':
DelList(L)
break
case '3':
Print(L)
break
case '4':
return
}
getch()
}
}while(ch != '4')
}
void main()
{
LinkList L
InitList(&L)
menu(L)
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)