单向链表,编译过程中显示程序出错自动退出

单向链表,编译过程中显示程序出错自动退出,第1张

你的代码里错误太多了,你对C语言指针 *** 作和链表算法还完全没有理解。建议再好好学习一遍。

最终导致你程序出错是这几句话:

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 L

InitList(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)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11224502.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存