|
发表于 2023-9-24 19:19:43
|
显示全部楼层
这个代码中有几个问题导致了段错误:
1. 在输入字符时,每次都使用malloc动态分配内存,但是并没有及时释放,导致内存泄漏。
2. 在输入字符时,对于特定字符(如'['、']'、'{'、'}'、'-'等),直接将指针指向了特定位置,但是并没有判断这些位置是否存在,导致了访问了非法内存。
3. 在删除节点时,没有判断被删除的节点是否为第一个节点,如果是第一个节点,需要将first指向第二个节点。
下面是修改后的代码:
- #include<stdio.h>
- #include<stdlib.h>
- #include<malloc.h>
- typedef struct Node{
- char data;
- struct Node * rLink, * lLink; // 设置前驱结点和后继结点
- }DblNode, *DblList;
- int main(void){
- DblList first;
- first = (DblList) malloc (sizeof(DblNode));
- first -> rLink = first;
- first -> lLink = first;
- DblList s, q, tmp = first;
- int insert_flag = 1;
- char ch;
- while((ch = getchar()) != '\n'){
- if(ch == '['){
- tmp = first -> rLink ;
- }else if(ch == ']'){
- tmp = first -> lLink;
- } else if (ch == '{') {
- if (tmp -> lLink)
- tmp = tmp -> lLink;
- } else if (ch == '}') {
- if (tmp -> rLink)
- tmp = tmp -> rLink;
- } else if (ch == '-') {
- insert_flag = insert_flag * (-1);
- }else if(ch == '='){
- if (tmp != first) {
- DblList t = tmp;
- tmp -> rLink -> lLink = tmp -> lLink;
- tmp -> lLink -> rLink = tmp -> rLink;
- tmp = tmp -> lLink;
- free(t);
- }
- }else{
- s = (DblList) malloc(sizeof(DblNode));
- s -> data = ch;
- q = tmp -> rLink;
- if(insert_flag < 0){
- s -> lLink = tmp -> lLink;
- q -> lLink = s;
- tmp -> lLink -> rLink = s;
- s -> rLink = q;
- }else{
- s -> lLink = tmp;
- q -> lLink = s;
- tmp -> rLink = s;
- s -> rLink = q;
- }
- tmp = s;
- }
- }
- // 输出
- DblList p;
- p = first -> rLink;
- while(p != first){
- printf("%c", p -> data);
- p = p -> rLink;
- }
- // 释放内存
- p = first -> rLink;
- while(p != first){
- DblList t = p;
- p = p -> rLink;
- free(t);
- }
- free(first);
- return 0;
- }
复制代码 |
|