習題11-8 單鏈表結點刪除

本題要求實現兩個函數,分別將讀入的數據存儲爲單鏈表、將鏈表中所有存儲了某給定值的結點刪除。

鏈表結點定義如下:
struct ListNode {
    int data;
    ListNode *next;
};
  函數接口定義:

struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );

函數readlist從標準輸入讀入一系列正整數,按照讀入順序建立單鏈表。當讀到−1時表示輸入結束,函數應返回指向單鏈表頭結點的指針。
函數deletem將單鏈表L中所有存儲了m的結點刪除。返回指向結果鏈表頭結點的指針。

裁判測試程序樣例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
    int data;
    struct ListNode *next;
};
struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );
void printlist( struct ListNode *L )
{
     struct ListNode *p = L;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\n");
}
int main()
{
    int m;
    struct ListNode *L = readlist();
    scanf("%d", &m);
    L = deletem(L, m);
    printlist(L);

    return 0;
}
 輸入樣例:10 11 10 12 10 -1
          10
 輸出樣例:11 12 

答案:

struct ListNode *readlist() { //讀入一系列正整數,按照讀入順序建立單鏈表。
	int c,flag=1;//檢查輸入是否正確
	scanf("%d",&c);
	/*建立表頭*/
	struct ListNode *l;
	l=(struct ListNode*)malloc(sizeof(struct ListNode));
	if(c!=(-1)){
	l->data=c;             
	l->next=NULL;		
	}else return NULL;

	/*尾插法建表*/
	struct ListNode *r;
	r=l;
	/*r始終動態地指向表尾,初值指向頭結點*/
	struct ListNode *n;
	while(flag) {
		scanf("%d",&c);
		if(c!=(-1)) {
			n=(struct ListNode *)malloc(sizeof(struct ListNode));
			n->data=c;
			n->next=NULL;
			r->next=n;
			r=n;//r就是當前尾結點
		} else {
			r->next=NULL;
			flag=0;
		}
	}
	return l;
}

struct ListNode *deletem( struct ListNode *L, int m ) {
	struct ListNode *h,*p,*q;
	h=L;
	//先保證頭結點不是m
	while(h->data==m&&(h->next!=NULL)) {
		p=h->next;
		free(h);
		h=p;
	}
	//如果整個鏈表都刪沒了,返回NULL 
	if(h->data==m){
		return NULL;
	}
	//刪除符合條件的結點
	p=h;
	q=p->next;
	while(q) {
		if(q->data==m) {
			p->next=q->next;
			free(q);
			q=p->next;
			continue;
		} else {
			p=q;
			q=q->next;
		}
	}
	return h;
}

一點小小的流水賬吧,紀念一下第一道和數據結構有關的題哈哈哈,我真的很菜。這道題斷斷續續竟然做了六個多小時…就很離譜,氣的眼淚都要掉出來了。寫出來其實沒有多久,只是一直鑽牛角尖想改自己的代碼,也看不進去別人寫的正確答案。
大一之前都沒接觸過編程,大一上加寒假因爲各種nt事浪費了很多時間。過去種種真的很想放下說重新開始,但真的比別人差太多了,實名菜狗弟弟,沒辦法原諒這樣的自己。
這段時間早上四點起來聽網課敲代碼記筆記,不斷反省,其實也是強迫症地焦慮,甚至條件反射到不管晚上睡不睡得着早上四點都要起來學習,導致午睡根本起不來,最近只能下午狂喝黑咖+中高強度運動避免午睡改掉這個辣雞作息,爭取穩定在晚十點半早四點半到五點。
還考慮了很久保研/考研/就業的事,學高數/線代/離散/大物/通信真的有壓榨我敲代碼的時間,但是又不想成績不好看,畢竟還想拼一拼獎學金x包括還在打辯論,三月份是無差別比賽,就在明天開始抽籤,寒假拿了個網辯季軍回來還是有點小高興的哈哈哈雖然和技術沒啥關係x。還在準備六級的事,爭取大一下就過六級。
雖然記錄流水賬的時候看起來很歡快,但是我永遠不會忘記這個春天。如果這二十天的焦慮,痛苦,強迫和抑鬱的心情是努力的敲門磚,那我願意也捨得去嘗試,希望,哦不是一定,度過這段日子之後要長長久久地堅持。
偷偷努力,要來證明我的選擇是對的,而這一切都是-
我 值 得。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章