前兩周在忙著科目一考試跟擺爛硬贯,所以沒(méi)每天敲代碼澳厢。
昨天做了道題 原地址題目詳情 - 習(xí)題11-8 單鏈表結(jié)點(diǎn)刪除 (pintia.cn)
#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;
}
struct ListNode* readlist() //錄入新數(shù)據(jù)至鏈表
? ? /* 函數(shù)readlist從標(biāo)準(zhǔn)輸入讀入一系列正整數(shù)首启,按照讀入順序建立單鏈表嚷缭。
? ? 當(dāng)讀到?1時(shí)表示輸入結(jié)束屡久,函數(shù)應(yīng)返回指向單鏈表頭結(jié)點(diǎn)的指針蝶桶。*/
{
? ? struct ListNode* header = malloc(sizeof(struct ListNode));//創(chuàng)建頭結(jié)點(diǎn)
? ? header->data = -1;
? ? header->next = NULL;
? struct ListNode* pRear = header;//尾部指針慨绳。不需要分配動(dòng)態(tài)內(nèi)存。直接指向頭結(jié)點(diǎn)
? ? int val = -1;
? ? scanf("%d", &val);
? ? while (val != -1)
? ? {
? ? ? ? struct ListNode* Newnode = malloc(sizeof(struct ListNode));//新節(jié)點(diǎn)
? ? ? ? Newnode->data = val;
? ? ? ? Newnode->next = NULL;
? ? ? ? pRear->next = Newnode; //將還在頭部的指針指向Newnode真竖;
? ? ? ? pRear = Newnode;//尾部指針指向新節(jié)點(diǎn)
? ? ? ? scanf("%d", &val);
? ? }
? ? while (val == -1)
? ? {
? ? ? ? break;
? ? }
? ? return header;
}
struct ListNode* deletem(struct ListNode* L, int m)
? ? //函數(shù)deletem將單鏈表L中所有存儲(chǔ)了m的結(jié)點(diǎn)刪除脐雪。
? ? //返回指向結(jié)果鏈表頭結(jié)點(diǎn)的指針。
{
? ? if (L->next==NULL)
? ? {
? ? ? ? printf("error恢共!\n");
? ? ? ? return NULL;
? ? }
? ? struct ListNode* h1 = NULL;
? ? struct ListNode* p1 = NULL;
? ? struct ListNode* pcurrent = L->next;
? ? while (pcurrent != NULL)
? ? {
? ? ? ? if (pcurrent->data != m)
? ? ? ? {
? ? ? ? ? ? struct ListNode* p = malloc(sizeof(struct ListNode));
? ? ? ? ? ? ? ? p->data = pcurrent->data;
? ? ? ? ? ? ? ? p->next = NULL;
? ? ? ? ? ? ? ? if (h1 == NULL)
? ? ? ? ? ? ? ? h1 = p;
? ? ? ? ? ? ? ? else? p1->next = p;
? ? ? ? ? ? ? ? p1 = p;
? ? ? ? }
? ? ? ? pcurrent = pcurrent->next;
? ? }
? ? return h1;
}
我新創(chuàng)了一個(gè)新鏈表來(lái)放非m的值战秋,再把新鏈表h1return回去,這樣可以更簡(jiǎn)單的解決問(wèn)題讨韭。
有新增的一小部分是:我使只輸入-1后的結(jié)果輸出error脂信。
注意:沒(méi)有在pta上試錯(cuò)評(píng)分,謹(jǐn)慎借鑒透硝,可能有條件不足之處狰闪。