int compare(node *A,node*B)
{
node *p=A;
node *tem;
node *q=B;
int i=0;
int flag=0;
while(1)
{
if(q->data!=p->data)
q=q->next;//找到B中與A首字符相等的字符位置
if(q==tem)//如果試圖找出B中每個與A首字符相等時其后所構成的字串與A比較失敗后,
//B回圈一遍后又回到最初開始比較的位置,則整個比較失敗,回傳失敗。
return false;
if(q->data=https://bbs.csdn.net/topics/=p->data)
while(1)
{
if(p->data!=q->data)
{
i++;
if(i==1)
q=tem;//tem記錄第一次找到B中與A首字符相等的字符位置***************這個陳述句沒看懂****
flag=1;//其后試圖第二次找到B中與A首字符相等的字符位置
break;
}
p=p->next;
q=q->next;
if(p==A)//如果A鏈表回圈一遍到頭值后也未發現不相等的字符則成功
return true ;
}
if(flag==1)
{
p=A;
flag=0;//試圖第二次找到B中與A首字符相等的字符位置時讓p指向A的頭重新與A進行比較
}
}
}
uj5u.com熱心網友回復:
未初始化的值是隨機的。實際上,如果此值是在堆疊上,那么進入函式,堆疊指標esp產生移動,tem = [esp + N], 原地址值是什么,就是未初始化tem的值。
uj5u.com熱心網友回復:
我debug之后發現確實是像您說的那樣,但是我有一個問題很疑惑,在我那個程式里,打開檔案直接運行,是可以正確跑的,但是當我一行一行進入函式去debug之后發現,函式是一個無限回圈,退出debug之后,程式就不能跑了,也會是無限回圈,而且會出現warning,tem未初始化,但是如果不debug就會正常運行,我真的很疑惑
我用的Code Blocks 以下是完整的代碼
問題描述:回圈鏈表首尾相連都有頭結點,然而在很多時候,當兩個回圈鏈表長度相等且構成環以后,可能在內容上完全相等,然而若從頭結點開始看這兩個回圈鏈表可能不能對應相等。此處給出判斷兩個回圈鏈表內容是否相等的方法。
然而還有通常做法中從首字母開始比一直到結束看是否相等,然而當待比較的字串含有多個基準字串的首字母時,也應從待比字串多處地方依次比較。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define true 1
#define false 0
typedef struct Lnode //定義鏈表結點的資料結構
{
char data;
struct Lnode *next;
}node;
node *create()//尾插法構建回圈鏈表不帶頭結點
{ char x;
node *h, *t;
t = h = (node *)malloc(sizeof(node));
h->next = NULL;
scanf("%c", &x);
while (x !='#')
{
node *s = (node *)malloc(sizeof(node));
s->data = x;
s->next = h->next;
t->next = s;
t = s;
scanf("%c", &x);
}
t->next=h->next;//尾和head->next相連
return h->next;//不帶頭結點
}
int compare(node *A,node*B)
{
node *p=A;
node *tem;
node *q=B;
int i=0;
int flag=0;
while(1)
{
if(q->data!=p->data)
q=q->next;//找到B中與A首字符相等的字符位置
if(q==tem)//如果試圖找出B中每個與A首字符相等時其后所構成的字串與A比較失敗后,
//B回圈一遍后又回到最初開始比較的位置,則整個比較失敗,回傳失敗。
return false;
if(q->data=https://bbs.csdn.net/topics/=p->data)
while(1)
{
if(p->data!=q->data)
{
i++;
if(i==1)
q=tem;//tem記錄第一次找到B中與A首字符相等的字符位置
flag=1;//其后試圖第二次找到B中與A首字符相等的字符位置
break;
}
p=p->next;
q=q->next;
if(p==A)//如果A鏈表回圈一遍到頭值后也未發現不相等的字符則成功
return true ;
}
if(flag==1)
{
p=A;
flag=0;//試圖第二次找到B中與A首字符相等的字符位置時讓p指向A的頭重新與A進行比較
}
}
}
int main(void)
{
printf("請輸入兩個字串以分別以#號結束") ;
node *a=create();
node *b=create();
if(compare(a,b))
printf("兩個字串回圈相等為同內容回圈鏈表");
else
printf("兩個字串不回圈相等為不同內容回圈鏈表");
}
uj5u.com熱心網友回復:
1: return h->next;//不帶頭結點 , 那么,頭結點分配的空間如何洗掉?2: 要找 回圈鏈表內容是否相等, 要以先列出個偽代碼:
for (i = B鏈表中的每個節點)
for (j = A鏈表中與 i 相等的每個節點)
以 i, j 作為 B.A鏈表的臨時開頭,檢測B.A鏈表是否完全相等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/91649.html
標籤:C語言
上一篇:C++參考
下一篇:Mbdyn在msvc下怎么編譯?
