2018年4月中旬的PTA(三)


C高級第三次PTA作業(1)

題目6-1 輸出月份英文名

1.設計思路

(1)算法(子函數)

第一步:定義字符型一級指針子函數名getmonth,形參整型n。
第二步:定義長度為12的字符數組指針months依次指向12個月份的升序英文名稱(首字母大寫)。
第三步:若數字月份n大於12或者小於1則返回空指針NULL,否則返回間接訪問months加n減1(對應n月份的二級指針指向的一級指針的值為指向對應n月份的地址)。

(2)流程圖

輸出月份英文名
輸出月份英文名

2.實驗代碼

#include <stdio.h>
char *getmonth( int n );
int main()
{
  int n;
  char *s;
  scanf("%d", &n);
  s = getmonth(n);
  if ( s==NULL ) printf("wrong input!\n");
  else printf("%s\n", s);
  return 0;
}
char *getmonth(int n)
{
  char *months[12]={"January","February","March","April","May","June",
  "July","August","September","October","November","December"};
  if(n<1||n>12)
  return NULL;
  else
  return *(months+n-1);
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:
輸出月份英文名
錯誤原因:字母寫錯和變量寫錯了就不說了。
在判斷不滿足可以輸出月份的條件的n的值的時候使用的邏輯運算符是與,導致這個條件一直是0,判斷時不會返回空指針。判斷中否則的返回語句返回的是一個常量,不能傳遞正確的指針,沒有根據月份的不同而變化。
改正方法:將邏輯運算符更改成或,只要滿足其中的一個條件就是1。將指針變量加上n減去1,對應代碼區中的相應的字符串的地址和下標。
錯誤信息2:
輸出月份英文名
輸出月份英文名
錯誤原因:判斷中滿足1-12月份的返回值是一個二級指針也就是指針數組的地址,這個地址指向的是指向字符串首元素地址的地址,主函數讀出來的就是地址不是字符串。
改正方法:在返回的二級指針前加上間接訪問符號*,間接訪問二級指針中的值,就是返回一級指針,這樣程序主函數讀出來的就是字符串了。
提交列表:
輸出月份英文名

題目6-2 查找星期

1.設計思路

(1)算法(子函數)

第一步:定義整型子函數名getindex,形參字符指針型s。
第二步:定義字符指針型的長度為7的字符數組days,將星期的英文從周日Sunday開始一次賦初值給days(每個星期字符串的首字母大寫),0賦給整型循環變量i。
第三步:若i小於7則下一步,否則返回-1。
第四步:若主函數輸入的星期字符串的首元素地址s與間接訪問days加i(第i+1個星期字符串的首字母的地址)通過strcmp函數比較的值為0則返回i的值,否則不執行。
第五步:i+1賦給i,跳到第三步。

(2)流程圖

2.實驗代碼

#include <stdio.h>
#include <string.h>
#define MAXS 80
int getindex( char *s );
int main()
{
  int n;
  char s[MAXS];
  scanf("%s", s);
  n = getindex(s);
  if ( n==-1 ) printf("wrong input!\n");
  else printf("%d\n", n);
  return 0;
}
int getindex(char *s)
{
  char *days[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
  for(short int i=0;i<7;i++)
  if(strcmp(s,*(days+i))==0)
  return i;
  return -1;
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:
查找星期
錯誤原因:變量少了一個字母之類的就不說了。
題目要求若輸入的不是代表星期的字符串就返回-1,代碼中沒有返回-1的語句。
改正方法:在循環結束后無返回說明並沒有滿足一樣的星期,是除星期以外的字符串,則返回-1。
錯誤信息2:
查找星期
查找星期
錯誤原因:for循環中判斷的是數據區的字符數組s的首元素地址是否與代碼區的二級指針days+i指向的一級指針的地址相等,本來地址的存放區域就不同了,在比較時判斷結果肯定始終是0。
改正方法:由裁判實現部分發現頭文件有<string.h>的文件,指明這道題目是可以用字符的比較來判斷,將原判斷條件改成strcmp(s,*(days+i))==0的形式來判斷。
提交列表:
查找星期

題目6-3 計算最長的字符串長度

1.設計思路

(1)算法(子函數)

第一步:定義整型子函數名max_len,形參字符指針型字符數組s,整型n。
第二步:間接訪問s(代表第一個單詞字符串的首元素地址)通過strlen函數計算的長度賦給整數length,1賦給整數i。
第三步:若i小於n則下一步,否則返回length的值。
第四步:若strlen((s+i))(第i+1個單詞字符串的首元素的地址通過strlen函數讀取並計算長度)大於length則strlen((s+i))賦給length,否則不執行。
第五步:i+1賦給i,跳到第三步。

(2)流程圖

2.實驗代碼

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 10
#define MAXS 20
int max_len( char *s[], int n );
int main()
{
  int i, n;
  char *string[MAXN] = {NULL};
  scanf("%d", &n);
  for(i = 0; i < n; i++)
  {
    string[i] = (char *)malloc(sizeof(char)*MAXS);
    scanf("%s", string[i]);
  }
  printf("%d\n", max_len(string, n));
  return 0;
}
int max_len(char *s[],int n)
{
  short int length=strlen(*s);
  for(short int i=1;i<n;i++)
  if(strlen(*(s+i))>length)
  length=strlen(*(s+i));
  return length;
}

3.本題調試過程碰到問題及解決辦法

錯誤信息:
計算最長的字符串長度
錯誤原因:函數中的strlen函數括號內的變量s、s+i是二級字符指針變量,strlen函數讀取一級字符指針變量的地址,並不能讀出一級指針指向的字符串首元素地址。
改正方法:在二級字符指針前加上間接訪問符號,使之成為二級指針指向的一級指針的值就是一級指針變量中存的字符串的首元素地址。
提交列表:
計算最長的字符串長度

題目6-4 指定位置輸出字符串

1.設計思路

(1)算法(子函數)

第一步:定義一個標志flag初始值為0,新建一個存放指定位置字符的一維字符數組result,下標j初始值為0,返回的指定第一個字符的地址ch1指針address初始值為回車符號。
第二步:利用一個for循環,若循環變量i大於等於MAXS則跳出循環,第j+1字符數組的元素為結束符,跳到第五步,否則下一步。
第三步:若標志為1則將原字符數組中的字符賦給result對應的下一個字符,j+1賦給j,如果此字符滿足指定的第二個字符ch2則跳出循環,跳到第五步,否則下一步。
第四步:若標志為0則判斷此時字符是否為指定字符ch1,若是則標志flag為1,並將此字符賦值給result的第一個元素,j+1賦給j,指針address指向ch1的地址,i+1賦給i,跳到第二步。
第五步:若一維字符數組result為空則輸出字符串result,並返回address的值(這里有輸出字符形式的區別具體看代碼)。

(2)流程圖

2.實驗代碼

#include <stdio.h>
#define MAXS 10
char *match( char *s, char ch1, char ch2 );
int main()
{
  char str[MAXS], ch_start, ch_end, *p;
  scanf("%s\n", str);
  scanf("%c %c", &ch_start, &ch_end);
  p = match(str, ch_start, ch_end);
  printf("%s\n", p);
  return 0;
}
char *match(char *s,char ch1,char ch2)
{
  short int flag=0,j=0;
  char *address={"\n"},result[MAXS];
  for(short int i=0;i<MAXS;i++)
  if(flag==1)
  {
    *(result+j)=*(s+i);
    j++;
    if(*(s+i)==ch2)
    break;
  }
  else
  {
    if(*(s+i)==ch1)
    {
      flag=1;
      *(result+j)=*(s+i);
      j++;
      address=(s+i);
    }
  }
  *(result+j)='\0';
  if(*result==NULL)
  {
    printf("%s",result);
    return address;
  }
  else
  {
    puts(result);
    return address;
  }
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:
指定位置輸出字符串
指定位置輸出字符串
錯誤原因:沒仔細讀懂題目的意思,一開始理解題目的意思以為是返回字符ch1和字符ch2之間的字符串,有主函數實現輸出,實際意思是用子函數實現輸出兩個字符之間的字符串,然后返回字符ch1在原字符串中的位置,即返回該字符的地址,由主函數實現輸出字符ch1開始所有字符,本人直接將要輸出的內容賦給了原字符串,改變了原字符串,子函數中也沒有實現輸出兩個字符之間的字符串,返回的指針是改變原字符串的指針。
改正方法:重新定義兩個字符指針變量address(用來存放字符ch1在原字符串中的地址)、result(用來存放字符ch1和字符ch2之間的字符),后續情況不做具體說明。
錯誤信息2:
指定位置輸出字符串
指定位置輸出字符串
錯誤原因:本段代碼中的實現子函數輸出字符ch1和字符ch2之間的字符串並沒有實現的錯誤在錯誤信息1中已經作出說明
字符指針不能實現一個一個賦值,字符指針可以實現一個一個賦值,在定義存放字符ch1和ch2中的字符串的變量時定義的是字符指針,所以兩個字符之間的字符並不能正確地賦值。考慮得不全面,第一個字符ch1可能在原始字符串中出現相同的ch1字符,如果不解決這種情況,返回的ch1的地址就是第二個ch1的地址,與原題目不符。
改正方法:將字符指針變量result改成字符數組型,result作為名字,將兩個字符之間的字符一個一個賦值給result。本題代碼設定了一個標識符flag初始值為0,如果沒有遇到和字符ch1相同的字符則始終不進行字符串的賦值,通過先判斷flag來排除出現多個ch1的情況,只要出現一次ch1就改變標識符為1,如此判斷就不會出現重復賦地址給address的情況了。
錯誤信息3:
指定位置輸出字符串
指定位置輸出字符串
錯誤原因:由於address沒有賦初值,在返回address時沒有返回一個正確的地址。
改正方法:本題由於不知道主函數應該輸出回車符號,所以一開始只是給字符指針address初始定義為空,
錯誤信息4:
指定位置輸出字符串
指定位置輸出字符串
錯誤原因:在字符數組result為空時輸出的不是result對應的空指針而是換行了,錯誤地理解了題目的意思,並且直接返回回車這樣的代碼是無效的。
改正方法:使用printf輸出result,不會多出一行的換行,給字符指針address賦一個換行符號的初值,並且在判斷中返回address。
提交列表:
指定位置輸出字符串
指定位置輸出字符串

一道編程題:

有一個axb的數組,該數組里面順序存放了從1到a*b的數字。其中a是你大學號的前三位數字,b是你大學號的后四位數字,比如你的學號是2017023936,那么數組大小是201 x 3936,數組中順序存放了1到791136(201和3936的積)的整數. 要求用篩選法,把該數組里的質數找出並打印出來,打印格式為5個質數一行,數字間用空格隔開。
篩選法具體做法是:先把N個自然數按次序排列起來。1不是質數,也不是合數,要划去。第二個數2是質數留下來,而把2后面所有能被2整除的數都划去。2后面第一個沒划去的數是3,把3留下,再把3后面所有能被3整除的數都划去。3后面第一個沒划去的數是5,把5留下,再把5后面所有能被5整除的數都划去。這樣一直做下去,就會把不超過N的全部合數都篩掉,留下的就是不超過N的全部質數。

1.設計思路

(1)算法

第一步:定義一個行是201列是3950的全局變量二維數組array。
第二步:input子函數調用,輸入數組array中各個元素的值。
第三步:利用雙層for循環,外循環變量i初始值為0,i大於等於201則跳出外循環,否則內循環變量j初始值為0,j大於等於3950則跳出內循環,執行外循環。
第四步:若二維數組對應的第i+1行第j+1列個元素的值不為0則判斷調用子函數prime判斷這個元素是否為素數,是則調用子函數exclude,使能夠被這個素數整除除這個素數本身以外的數都變成0,否則讓這個非素數變成0。
第五步:j+1賦給j,跳到第二步,若是滿足條件跳出內循環則i+1賦給i,跳到第二步。

第一步:定義空子函數input,傳遞參數二級指針array。
第二步:利用兩個for循環,將從number從1開始的值依次賦給二維數組array的每個元素。

第一步:定義短整型子函數名prime,傳遞參數正整數number。
第二步:若number為1則返回0,否則下一步。
第三步:利用for循環,循環變量i初始值為1,循環條件為i小於等於number除以2,循環時i+1賦給i。
第四步:若i為1則不執行跳到第二步,否則判斷number是否能被i整除,能整除則返回0。
第五步:跳出循環則說明是素數返回1。

第一步:定義空子函數名為exclude,傳遞參數array和number。
第二步:利用兩個for循環,同上
第三步:若第i+1行第j+1列元素的值不等於0則下一步,否則跳到上一步進行循環。
第四步:若第i+1行第j+1列元素的值除以number的余數等於0且商不等於1則第i+1行第j+1列元素的值為0,否則跳到第二步進行循環。

第一步:定義空子函數名為output,傳遞參數array。
第二步:定義短整型數count初始值為1。
第三步:利用兩個for循環,同上
第四步:若第i+1行第j+1列元素的值不等於0則下一步,否則跳到上一步進行循環。
第五步:若count等於1則輸出第i+1行第j+1列元素的值,count+1賦給count,否則下一步。
第六步:若count等於5則輸出空格第i+1行第j+1列元素的值回車,1賦給count,否則輸出空格第i+1行第j+1列元素的值,count+1賦給count。

(2)流程圖

2.實驗代碼

#include <stdio.h>
#include <stdlib.h>
int array[201][3950];
void input(int array[201][3950]);
short int prime(int number);
void exclude(int array[201][3950],int number);
void output(int array[201][3950]);
int main()
{
	input(array);
	for(int i=0;i<201;i++)
	for(int j=0;j<3950;j++)
	if(array[i][j])
	{
		if(prime(array[i][j]))
		exclude(array,array[i][j]);
		else
		array[i][j]=0;
	}
	output(array);
	return 0;
}
void input(int array[201][3950])
{
	int number=0;
	for(int i=0;i<201;i++)
	for(int j=0;j<3950;j++)
	array[i][j]=++number;
}
short int prime(int number)
{
	if(number==1)
	return 0;
	for(short int i=1;i<=number/2;i++)
	if(i==1)
	continue;
	else if(number%i==0)
	return 0;
	return 1;
}
void exclude(int array[201][3950],int number)
{
	for(int i=0;i<201;i++)
	for(int j=0;j<3950;j++)
	if(array[i][j])
	if(array[i][j]%number==0&&array[i][j]/number!=1)
	array[i][j]=0;
}
void output(int array[201][3950])
{
	short int count=1;
	for(int i=0;i<201;i++)
	for(int j=0;j<3950;j++)
	{
		if(array[i][j])
		{
			if(count==1)
			{
				printf("%d",array[i][j]);
				count++;
			}
			else if(count==5)
			{
				printf(" %d\n",array[i][j]);
				count=1;
			}
			else
			{
				printf(" %d",array[i][j]);
				count++;
			}
		}
	}
}

3.本題調試過程碰到問題及解決辦法

C高級第三次PTA作業(2)

題目6-1 奇數值結點鏈表

1.設計思路

(1)算法

第一步:定義子函數struct ListNode指針型名為readlist。
第二步:定義單向鏈表的頭指針head為空,利用for循環,其中定義一個尾結點和一個動態指針結點。
第三步:輸入結構中需要的數據data,並讓動態指針指向輸入的數據,尾指針指向空。
第四步:判斷輸入的data數據是否為1,若是則跳出循環,跳到第五步,否則讓單向鏈表指向動態指針,若頭指針為空則頭指針指向動態結點,否則尾結點的next指針指向動態結點。
第五步:尾指針tail始終指向動態結點,跳到第第三步。
第六步:返回頭指針。

第一步:定義一個新奇數鏈表的頭指針oddhead為空,新的偶數鏈表的頭指針evenhead為空。
第二步:讓頭指針oddhead指向其中的奇數結點,依次找出奇數結點並且組成一個奇數單向鏈表。
第三步:讓頭指針evenhead指向原鏈表中的偶數結點,找出偶數結點形成的偶數單向鏈表,並讓原鏈表的頭指針指向新建偶數單向鏈表。
第四步:返回奇數鏈表的頭指針oddhead。

(2)流程圖

2.實驗代碼

#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
    int data;
    struct ListNode *next;
};
struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
  struct ListNode *p = L;
  while (p) 
  {
    printf("%d ", p->data);
    p = p->next;
  }
  printf("\n");
}
int main()
{
  struct ListNode *L,*Odd;
  L=readlist();
  Odd=getodd(&L);
  printlist(Odd);
  printlist(L);
  return 0;
}
struct ListNode *readlist()
{
  struct ListNode *head=NULL;
  for(struct ListNode *i=NULL,*tail=NULL;;tail=i)
  {
  	i=(struct ListNode*)malloc(sizeof(struct ListNode));
  	scanf("%d",&i->data);
  	i->next=NULL;
  	if(i->data==-1)
  	break;
  	else if(head)
  	tail->next=i;
  	else
  	head=i;
  }
  return head;
}
struct ListNode *getodd(struct ListNode **L)
{
  struct ListNode *oddhead=NULL,*evenhead=NULL;
  for(struct ListNode *i=(*L),*oddtail=NULL,*eventail=NULL;i!=NULL;i=i->next)
  if(i->data%2!=0)
  {
    struct ListNode *odd=(struct ListNode *)malloc(sizeof(struct ListNode));
    odd->data=i->data;
    odd->next=NULL;
    if(oddhead)
    oddtail->next=odd;
    else
    oddhead=odd;
    oddtail=odd;
  }
  else
  {
    struct ListNode *even=(struct ListNode *)malloc(sizeof(struct ListNode));
    even->data=i->data;
    even->next=NULL;
    if(evenhead)
    eventail->next=even;
    else
    evenhead=even;
    eventail=even;
  }
  (*L)=evenhead;
  return oddhead;
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:
奇數值結點鏈表
奇數值結點鏈表
錯誤原因:這個錯誤點主要是因為對新建鏈表的知識點還不是很懂。
在子函數getodd中新建奇數鏈表的時候直接將原單鏈表賦值給了新鏈表,間接改變了原鏈表,還使原鏈表結點中指針指向了空,使以后的結點都斷了。
改正方法:新建動態結點odd,重新分別把原結點的值賦給新結點odd的值,然后新結點odd的值賦給新奇數鏈表。
錯誤信息2:
奇數值結點鏈表
奇數值結點鏈表
奇數值結點鏈表
錯誤原因:找不出原因。
改正方法:具體做法請查閱算法和實驗代碼。本題老師課上講述的時候是說不能用刪除的方法做,一開始的時候就是使用的是刪除的方法,我覺得這題還有解決的方法,就是還沒找到。代碼修改后總是有一些小問題解決不了,具體的不清楚是什么原因。還請老師指點。
提交列表:
奇數值結點列表
奇數值結點列表
奇數值結點列表
奇數值結點列表

題目6-2 學生成績列表處理

1.設計思路

(1)算法

第一步:定義鏈表的頭指針head為空。
第二步:利用for循環輸入數據,若輸入的num為0則跳出循環,跳到第五步,否則下一步
第三步:將滿足條件的數據輸入存入動態結點i中,若頭指針為空則頭指針head指向動態結點,否則尾指針tail中的next指向動態結點。
第四步:尾指針tail始終指向動態結點,跳到第二步。
第五步:返回頭指針head。

第一步:定義前面的指針front為頭指針。
第二步:利用for循環遍歷鏈表。
第三步:若循環指針i指向空,則跳出循環,跳到第六步,否則下一步。
第四步:若鏈表中某一個結點中的score小於傳入的參數min_score則刪除這個結點,若是頭結點則頭指針指向第二個結點,釋放這個結點的動態內存,此時的循環變量i指向前面的指針front,否則下一步。
第五步:表示前面的指針front指向此時的結點,跳到第三步。
第六步:返回頭指針head。

(2)流程圖

2.實驗代碼

#include <stdio.h>
#include <stdlib.h>
struct stud_node
{
  int num;
  char name[20];
  int score;
  struct stud_node *next;
};
struct stud_node *createlist();
struct stud_node *deletelist( struct stud_node *head, int min_score );
int main()
{
  int min_score;
  struct stud_node *p,*head=NULL;
  head=createlist();
  scanf("%d",&min_score);
  head=deletelist(head, min_score);
  for( p = head; p != NULL; p = p->next )
  printf("%d %s %d\n", p->num, p->name, p->score);
  return 0;
}
struct stud_node *createlist()
{
  struct stud_node *head=NULL;
  for(struct stud_node *i=NULL,*tail=NULL;;tail=i,i=i->next)
  {
    i=(struct stud_node *)malloc(sizeof(struct stud_node));
    scanf("%d",&i->num);
    if(i->num==0)
    break;
    scanf("%s %d",i->name,&i->score);
    i->next=NULL;
    if(head)
    tail->next=i;
    else
    head=i;
  }
  return head;
}
struct stud_node *deletelist(struct stud_node *head,int min_score)
{
  for(struct stud_node *i=head,*front=head;i!=NULL;i=i->next)
  {
    if(i->score<min_score)
    {
      if(i==head)
      head=i->next;
      else
      front->next=i->next;
      free(i);
      i=front;
    }
    front=i;
  }
  return head;
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:
學生成績列表處理
學生成績列表處理
錯誤原因:不重要的錯誤:略。
for循環中第二個判斷條件錯誤,條件head始終為1,致使不會進行else中的語句。
改正方法:判斷條件應該更正為循環變量i是否為頭指針,再執行相關的語句。
錯誤信息2:
學生成績列表處理
學生成績列表處理
錯誤原因:釋放掉變量i中的動態空間之后,前一個結點指針front就沒有可以指向的結點了,使front的指向產生盲點。
改正方法:在釋放i后將i指向原先的front,使此時的i為刪除結點之前的結點,不會使front的指向不清楚,這樣就可以直接判斷刪除結點的下一個結點。
提交列表:
學生成績列表處理
學生成績列表處理

題目6-3 鏈表拼接

1.設計思路

(1)算法

第一步:利用兩個for循環,外循環控制list2,內循環控制list1。
第二步:按照升序將鏈表list2中的結點插入到鏈表list1中去,釋放list2鏈表的內存。
第三步:返回頭指針list1。

(2)流程圖

2.實驗代碼

#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
  int data;
  struct ListNode *next;
};
struct ListNode *createlist(); /*裁判實現,細節不表*/
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
void printlist( struct ListNode *head )
{
  struct ListNode *p = head;
  while (p)
  {
    printf("%d ", p->data);
    p = p->next;
  }
  printf("\n");
}
int main()
{
  struct ListNode  *list1, *list2;
  list1 = createlist();
  list2 = createlist();
  list1 = mergelists(list1, list2);
  printlist(list1);
  return 0;
}
struct ListNode *mergelists(struct ListNode *list1,struct ListNode *list2)
{
  for(struct ListNode *i=list2;i!=NULL;i=i->next)
  for(struct ListNode *j=list1,*front=list1;j!=NULL;j=j->next)
  {
    if(i->data<=j->data)
    {
      struct ListNode *assignment=(struct ListNode *)malloc(sizeof(struct ListNode));
      assignment->data=i->data;
      assignment->next=NULL;
      if(j==list1)
      {
        assignment->next=list1;
        list1=assignment;
      }
      else
      {
        assignment->next=j;
        front->next=assignment;
      }
      break;
    }
    else if(j->next==NULL)
    {
      struct ListNode *assignment=(struct ListNode *)malloc(sizeof(struct ListNode));
      assignment->data=i->data;
      assignment->next=NULL;
      j->next=assignment;
      break;
    }
    front=j;
  }
  free(list2);
  return list1;
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:
鏈表拼接
鏈表拼接
錯誤原因:for循環中直接將list2中小於等於list1中的結點賦給動態指針變量assignment,直接使assignment成為了頭指針,意味着將從i開始之后的單向鏈表全部賦值給了assignment,改變了原來的固定的單向鏈表。沒有考慮到list2中的數據大於list1中的所有數據的情況,輸出鏈表時就不會輸出大於list1的數據。
改正方法:將當時結點內的值賦給動態指針變量assignment,再讓assignment中的指針指向空,就不會改變原來的單向鏈表了。判斷一下list1鏈表循環到最后一個結點的時候的情況,這種情況說明此時list2中的這個結點的數據大於list1中所有結點中的數據,使list1中最后一個結點的指針指向具有list2數據的此時動態指針變量assignment。
錯誤信息2:
鏈表拼接
鏈表拼接
錯誤原因:在判斷循環變量j是否等於頭指針list1時,判斷為真的第一個語句中的賦值錯誤,將第二個結點賦給了變量assignment中的指針,跳過了頭結點,相當於刪除了第一個結點。
改正方法:讓assignment中的指針指向第一個結點,並且頭指針指向assignment。
提交列表:
鏈表拼接
鏈表拼接

學習總結和進度

總結知識點和錯誤:

(1)如何理解指針數組,它與指針、數組有何關系?為何可以用二級指針對指針數組進行操作?
指針數組中的數組名是一個二級指針,整個數組是一級指針,它是由數組構成的一個指針,指向多個值,這種指針可以用來存放數組和指針。因為初始定義一個數組為指針,是這個數組中存放指針,並且數組的數組名本身就是一個指針,這樣數組中的值是數據的地址,數組名形成的二級指針指向的是存放地址的一級指針的地址。
(2)將C高級第三次PTA作業(1)任何一個題目改為使用二級指針對指針數組進行操作。
在前面的代碼中已經實現了。
(3)用指針數組處理多個字符串有何優勢?可以直接輸入多個字符串給未初始化的指針數組嗎?為什么?
借用了一下書上的話:更加方便靈活地處理多個字符串,節省內存單元,字符串的長度可以隨意長,移動指針比移動字符串節省時間。
不能,因為指針數組中的字符串是存在代碼區的,代碼區的字符串是不能更改的,只能在源代碼中更改,若要輸入,只能使用二維的字符數組,存在數據區。

GitHub地址:

C高級第三次PTA作業

評論博客地址:

董欣
董雅潔
馮子旋

學習進度表格和折線圖

日期 代碼時間 代碼行數 博客時間 博客行數
4月9日 0 0 0 0
4月10日 86 7 23 150
4月11日 15 6 250 20
4月12日 50 6 45 239
4月13日 0 0 0 0
4月14日 42 22 0 0
4月15日 101 0 0 0
4月16日 0 0 0 0
4月17日 0 0 0 0
4月18日 0 0 0 0
4月19日 0 0 0 0
4月20日 0 0 0 0
4月21日 0 0 0 0
4月22日 0 0 0 0
4月23日 0 0 0 0

學習進度


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM