链表的程序崩溃了

链表的程序崩溃了,第1张

你这个链表总共有两个节点,最后一个节点的next不是NULL当进行head->next != NULL 的判断的时候还会进入循环里,此时的head->next指向内容可能是非法的,因此引起崩溃。

你下面的for循环只是循环两回,因此就没事,到最后一个节点就不往下执行。

Carry(MT);和void Caculate(link head)有误。

要改成Carry(&MT);和void Caculate(link head);

因为你会在函数内把MT的值改掉,并返回改掉后的值,用link head是无法返回修改后的指针,必须用link head。

如果指针的指针不太好理解,你把link当作int就好理解了。

你好!

上面的程序问题有点多,我帮你修改了一下:

# include <stdioh>

# include <stdlibh>

# include <malloch>

typedef struct pnode

{

int data;

struct pnode next;

}node,list;

node initlist(node head)

{

head=(node)malloc(sizeof(node));

if (NULL == head)

{

printf("分配内存失败!程序终止!");

exit(-1);

}

// head->next=NULL;

return head;

}

node creatlist(list head)

{

node p = head;

p->next = NULL;

// node first = (node)malloc(sizeof(node));

// getchar();

// scanf("%d",first->data);

// printf("输入一些数,按ENTER退出\n");

int i = 0,val;

while(i<5)

{

printf("请输入第%d个节点的有效数据:",i+1);

scanf("%d",&val);

node pNew = (node )malloc(sizeof(node));

if (NULL == pNew)

{

printf("分配内存失败!程序终止!");

exit(-1);

}

pNew->data = val;

p->next = pNew;

pNew->next = NULL;

p = pNew;

i++;

}///

return head;

}

void display(list head)

{

node p = head->next;

while(p->next != NULL)

{

printf("%d->",p->data);//

p = p->next;

}

printf("%d\n",p->data);

}

int main(void)

{

list head1;

head1 = initlist(head1);

head1 = creatlist(head1);

display(head1);

return 0;

}

/

在vc++60中的输出结果:

------------------------

请输入第1个节点的有效数据:1

请输入第2个节点的有效数据:2

请输入第3个节点的有效数据:3

请输入第4个节点的有效数据:4

请输入第5个节点的有效数据:5

1->2->3->4->5

---------------------------

/

仅供参考!呵呵

#include <stdioh>

#include <malloch>

#include <stdlibh>

#define ElemType int

typedef struct Node

{

ElemType data;

struct Node pNext;

}NODE, PNODE;

PNODE create_list(void); //创建带有头结点的链表

void traverse_list(PNODE pHead); //遍历链表

bool is_empty(PNODE pHead); //判断链表是否为空

int length_list(PNODE pHead); //计算链表的长度

bool insert_list(PNODE pHead, int pos, int val); //向链表中制定位置插入数据

bool delete_list(PNODE pHead, int pos, int val); //删除链表中指定位置的数据

void sort_list(PNODE pHead); //对链表进行排序 *** 作

PNODE check_list(PNODE pHead, ElemType value); //依据节点的数据值来查找数据

bool update_list(PNODE pHead, ElemType value1, ElemType value2); //更新数据

int main(void)

{

PNODE pHead = NULL; //等价于struct Node pHead = NULL;

pHead = create_list(); //创建一个非循环链表,并将该链表的头结点的地址赋值给头结点

traverse_list(pHead);

if (is_empty(pHead))

{

printf("链表是空的!\n");

}

else

{

printf("链表不为空!\n");

}

int len;

printf("链表的长度是: %d\n", len = length_list(pHead));

sort_list(pHead);

traverse_list(pHead);

if(insert_list(pHead, 4, 5))

{

printf("数据插入成功!插入后的数据遍历结果为:\n");

traverse_list(pHead);

}

else

{

printf("数据插入失败!原始数据遍历结果为:\n");

traverse_list(pHead);

}

int val;

if(delete_list(pHead, 4, &val))

{

printf("Success -> val is %d\n The result is :\n", val);

traverse_list(pHead);

}

else

{

printf("Faile!\n");

}

//做查询

printf("请输入要查询的数据:\n");

int value, value1;

scanf("%d", &value);

if(NULL != check_list(pHead, value))

printf("链表中存在该数据!\n");

else

printf("链表中不存在该数据!\n");

//下面进行数据更新

printf("请输入被更新的数据及更新后的数据:\n");

scanf("%d %d", &value, &value1);

if(update_list(pHead, value, value1))

printf("The data is updated success!\n");

else

printf("The data is not updated!\n");

//数据更新后重新遍历链表

sort_list(pHead);

return 0;

}

PNODE create_list(void)

{

int len; //有效结点的个数

int i;

int val; //用来存储用户输入的结点的值

printf("请输入您要生成的链表的结点的个数:\n");

scanf("%d", &len);

//先生成一个头结点,然后在下面的for循环中将生成的临时结点链接进来就好了

PNODE pHead = (PNODE)malloc(sizeof(NODE));

if(NULL == pHead)

{

printf("内存分配失败,程序终止!\n");

exit(-1);

}

//pHead->data = len;

//在for循环中进行挂结点的过程是,有一个尾指针pTail,每次创建新结点后,利用pTail->pNext = pNew; pTail = pTail->pNext;

PNODE pTail = pHead;

pTail->pNext = NULL;

for (i=0; i<len; ++i)

{

printf("请输入第%d个结点的数值:", i+1);

scanf("%d", &val);

//数据接收异常处理

char ch;

while((ch=getchar()) != '\n')

continue;

//每循环一次就利用pNew获取一个新地址,并在pNew中存储数据,并将pNew挂到链表中去

PNODE pNew = (PNODE)malloc(sizeof(NODE));

if(NULL == pNew)

{

printf("分配失败,程序终止!\n");

exit(-1);

}

if(val == pTail->data)

{

printf("是否输入错误,本次输入数据与前者相同,请确认(如果正确输入Y,否则输入N):");

ch=getchar();

// printf("%c\n", ch);

if (ch =='N' || ch == 'n')

{

i--;

continue;

}

}

//利用尾指针进行挂结点的过程

printf("%d\n", val);

pNew->data = val;

pTail->pNext = pNew;

pTail = pNew;

pTail->pNext = NULL;

}

return pHead;

}

void traverse_list(PNODE pHead)

{

PNODE p = pHead->pNext; //这里一定要注意p是指pHead的指针域的值,而不是pHead后面的那个结点

while(NULL != p)

{

printf("%d\t", p->data);

p = p->pNext;

}

printf("\n");

return;

}

bool is_empty(PNODE pHead)

{

if(NULL == pHead->pNext)

return true;

else

return false;

}

int length_list(PNODE pHead)

{

int len = 0;

PNODE p = pHead->pNext;

//printf("")

while(NULL != p)

{

len++;

p = p->pNext;

}

return len;

}

//在pHead所指链表的第pos个结点的前面插入一个新的结点,并且该结点的值是val;pos从1开始

bool insert_list(PNODE pHead, int pos, int val)

{

int i = 0; //用于统计链表中结点的个数,最终也就得到了链表的长度

PNODE p = pHead;

while(NULL != p && i < pos-1) //标识指针还有后续结点,并且i的数值要比pos小1

{

p = p->pNext;

++i;

}

//上面的循环中首先是i=0的时候,如果链表为空或者i>=pos-1(说明pos<=0)就直接往下走了,然后if成立,则退出程序;

//如果刚进入程序的时候没有退出,则说明pos是正数并且链表不为空。进去开始循环并利用i统计链表的长度,如果p=NULL先成立则说明pos数据过大;

//i永远不会大于pos,最好的情形就是碰到p=null,使得指针找到了要插入数据位置的前驱结点,方便后面进行插入

if(i>pos-1 || NULL==p)

return false;

PNODE pNew = (PNODE)malloc(sizeof(NODE));

if(NULL == pNew)

{

printf("动态内存分配失败!\n");

exit(-1);

}

pNew->data = val;

PNODE q = p->pNext;

p->pNext = pNew;

pNew->pNext = q;

return true;

}

bool delete_list(PNODE pHead, int pos, int pVal)

{

int i = 0; //用于统计链表中结点的个数,最终也就得到了链表的长度

PNODE p = pHead;

while(NULL != p && i < pos-1) //标识指针还有后续结点,并且i的数值要比pos小1

{

p = p->pNext;

++i;

}

//上面的while循环最大可能就是造成 i=pos-1 或者 NULL= p

//如果i>pos-1则表示前面的while是由于NULL=p造成的,也就是说链表的长度要小于

if(i>pos-1 || NULL==p)

return false;

PNODE q = p->pNext;

pVal = q->data;

p->pNext = p->pNext->pNext;

free(q);

q = NULL;

return true;

}

//不改变链表的指向,而是交换各个结点的数值

void sort_list(PNODE pHead) //非常的重要

{

int i, j, tmp, len = length_list(pHead);

PNODE p, q;

for(i=0,p=pHead->pNext; i<len-1; ++i,p=p->pNext)

{

for(j=i+1,q=p->pNext; j<len; ++j,q=q->pNext)

{

if(p->data > q->data)

{

tmp = p->data;

p->data = q->data;

q->data = tmp;

}

}

}

return;

}

PNODE check_list(PNODE pHead, ElemType value)

{

PNODE p;

while(pHead->pNext != NULL)

{

pHead = pHead->pNext;

if(pHead->data == value)

{

p = pHead;

return p;

}

}

return p;

}

bool update_list(PNODE pHead, ElemType value1, ElemType value2)

{

PNODE p = check_list(pHead, value1);

if(NULL == p)

{

return false;

}

else

{

p->data = value2;

}

return true;

}

这个是一个还算完整的链表 *** 作的例子,有些功能是以前写的

你看看吧,应该符合你的要求

刚才忘记添加链表的销毁了

void destroy(PNODE pHead)

{

PNODE tmp = pHead;

while(pHead->pNext != NULL)

{

tmp = pHead;

pHead = pHead->pNext;

free(tmp);

}

}

记得在前面进行函数声明

如果可以的话就采纳吧,嘿嘿

没有缩进,读的我头晕脑胀

while(scanf("%d",&n),n!=-1),为什么不写成scanf("%d",&n);while(n!=-1)

我在想如果链表长度是1,会不会有问题?

你好像不会调试程序,比如单步运行等等。你也可以在代码中,临时加入输出语句,监视数据的状态?

不想费那么大劲去读你的代码。。。

while中的 printf("请输入学生的学号姓名和成绩:");应为printf("请输入学生的学号姓名和成绩:",n+1);掉了n+1,其实对程序没有影响,只是为了提示当前输入的是第几条记录。。

#include<stdioh>

#include<stdlibh>

#include<stringh>

#include<malloch>

#define LEN sizeof(struct stu)

struct stu create(); // 创建链表

void print(struct stu head); // 打印链表

struct stu

{

char name[20];

int age;

struct stu toNext;

};

 main()

{

struct stu temp;

temp = create();

printf("============================\n");

print(temp);

system("pause");

}

struct stu create() //类似 int main(), struct stu 类似int create()类似main()

{

struct stu head, last, next;

head = (struct stu )malloc(LEN);

printf("请输入名字:\n");

scanf("%s", &head->name);

printf("请输入年龄:\n");

scanf("%d%c", &head->age);

last = next = head;

while(last->age)

{

next = (struct stu )malloc(LEN);

printf("请输入名字:\n");

scanf("%s", &next->name);

printf("请输入年龄:\n");

scanf("%d", &next->age);

last->toNext = next->age == 0  NULL : next;

last = next;

}

return head;

}

void print(struct stu head)

{

struct stu p;

p = head;

do

{

printf("--OK--\n");

printf("名字:%s年龄:%d\n", p->name, p->age);

p = p->toNext;

}while(p);

}

以上就是关于链表的程序崩溃了全部的内容,包括:链表的程序崩溃了、编程C++计算2^1000这个数的每位相加所得的值,用链表法,但是显示程序停止工作,各位大神可以看看、这个链表程序错在哪啊!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9669361.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存