c语言奇数值结点链表,习题11-7 奇数值结点链表 (20 分)
本題要求實現兩個函數,分別將讀入的數據存儲為單鏈表、將鏈表中奇數值的結點重新組成一個新的鏈表。鏈表結點定義如下:
struct ListNode {
int data;
ListNode *next;
};
函數接口定義:
struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
函數readlist從標準輸入讀入一系列正整數,按照讀入順序建立單鏈表。當讀到?1時表示輸入結束,函數應返回指向單鏈表頭結點的指針。
函數getodd將單鏈表L中奇數值的結點分離出來,重新組成一個新的鏈表。返回指向新鏈表頭結點的指針,同時將L中存儲的地址改為刪除了奇數值結點后的鏈表的頭結點地址(所以要傳入L的指針)。
裁判測試程序樣例:
#include #include 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;
}
/* 你的代碼將被嵌在這里 */
輸入樣例:
1 2 2 3 4 5 6 7 -1
輸出樣例:
1 3 5 7
2 2 4 6
一整天的成果。試驗了很多新想法全都成功了。
struct ListNode *readlist()
{
struct ListNode *head,*tail,*p;
head=tail=NULL;
while(1)
{
p=(struct ListNode *)malloc(sizeof(struct ListNode));
p->next=NULL;
scanf("%d",&(p->data));
if(head==NULL)
head=p;
else tail->next=p;
tail=p;
if(p->data==-1)
break;
}
return head;
}
struct ListNode *getodd( struct ListNode **L )
{
static struct ListNode *tail,*head,*head1,*tail1;
head=tail=NULL;
head1=tail1=NULL;
int p;
while(1)
{p=(*L)->data;
if(p<0)
break;
if(p%2!=0)
{
if(head==NULL)
head=*L;
else tail->next=*L;
tail=*L;
}
if(p%2==0)
{
if(head1==NULL)
head1=*L;
else tail1->next=*L;
tail1=*L;
}
*L=(*L)->next;
}
if(head!=NULL)
tail->next=NULL;
if(head1!=NULL)
tail1->next=NULL;
*L=head1;//靜態變量在函數結束時才不會消失。
return head;
}
總結
以上是生活随笔為你收集整理的c语言奇数值结点链表,习题11-7 奇数值结点链表 (20 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最优化评分法c语言,最优化方法及其实现(
- 下一篇: 比较简单的c语言编辑器,大佬们,小菜鸟想