清華資料結構PA1的祖瑪編程作業,前15個都是AC,后面5個case就提示runtime error(11)-SIGSEGV了,試著找了問題 但是一直找不到問題在哪?頭疼
#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 10000
char beads[MAXNUM]; //記錄初始鏈表的節點資訊
typedef struct node{
char col;
struct node *pre,*suc;
}node;
int Insert(node* head, int k, char c, int _size); //在_size規模的鏈表中,將新節點插入到k位置,
//節點顏色為c,回傳鏈表規模
int Del_scol(node *head,node *trail,int _size); //多次遍歷,洗掉3+連續同色的節點,回傳鏈表規模
int main()
{
node *head=(node*)malloc(sizeof(node)); //初始化鏈表
node *trail=(node*)malloc(sizeof(node));
head->suc=trail;
head->pre=NULL;
trail->pre=head;
trail->suc=NULL;
head->col='-';
trail->col='\0'; //配合puts()函式
gets(beads);
int _size=0; //鏈表規模
for(int i=0;beads[i];i++) //更新初始鏈表規模
_size=Insert(head,i,beads[i],_size);
int n; //執行次數
scanf("%d",&n);
if(n==0)
if(_size==0)
printf("%c\n",head->col);
else{
_size=Del_scol(head,trail,_size);
if(_size==0)
printf("%c\n",head->col);
else
for(node *p=head->suc;p!=trail;p=p->suc)
printf("%c",p->col);
}
else{
int k[n]; //插入位置
char co[n]; //新節點的顏色
for(int i=0;i<n;i++) //輸入k組插入位置和顏色
scanf("%d %c",&k[i],&co[i]);
char rcd[n][_size+n]; //紀錄每次操作之后剩余節點的資訊
for(int i=0;i<n;i++){ //插入新節點,消除同色節點,并計錄剩余節點資訊
node *p; //指向待錄入的字符
int h; //rcd[]中第i行第h列
_size=Insert(head,k[i],co[i],_size);
_size=Del_scol(head,trail,_size);
if(_size==0){
rcd[i][0]='-';
rcd[i][1]='\0';
}
else
for(p=head->suc,h=0;p;p=p->suc,h++)
rcd[i][h]=p->col;
}
for(int i=0;i<n;i++) //回放
puts(rcd[i]);
}
return 0;
}
int Insert(node* head,int k,char c,int _size){
node *ne=(node*)malloc(sizeof(node)); //創建新節點
ne->col=c;
node *p=head;
if(k>_size) //k越界處理
k=_size;
else if(k<0)
k=0;
for(int i=0;i<k;i++)
p=p->suc;
p->suc->pre=ne;
ne->suc=p->suc;
p->suc=ne;
ne->pre=p;
return ++_size;
}
int Del_scol(node *head, node *trail, int _size){
node *ph,*pt; //同色區域的指標頭和指標尾
int num=0; //同色節點數量
ph=head->suc;
while(ph&&ph->suc&&ph->suc->suc){
if(ph->col==ph->suc->col && ph->col==ph->suc->suc->col){ //至少連續同色三次
num=3;
pt=ph->suc->suc;
while(pt->col==pt->suc->col){ //指向同色區域尾節點
pt=pt->suc;
num++;
}
ph->pre->suc=pt->suc;
pt->suc->pre=ph->pre;
_size-=num;
ph=head->suc;
}
else
ph=ph->suc; //回到被洗掉節點的前驅節點
}
return _size;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59038.html
標籤:C語言
上一篇:c語言將已排序的學生成績檔案進行插入處理。插入一個學生的3門課程成績,程式先計算新插入學生的平均成績,然后將它按成績高低順序插入,插入后建立一個新檔案。
