习题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 
#include 
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。还在准备六级的事,争取大一下就过六级。
虽然记录流水账的时候看起来很欢快,但是我永远不会忘记这个春天。如果这二十天的焦虑,痛苦,强迫和抑郁的心情是努力的敲门砖,那我愿意也舍得去尝试,希望,哦不是一定,度过这段日子之后要长长久久地坚持。
偷偷努力,要来证明我的选择是对的,而这一切都是-
我 值 得。

你可能感兴趣的:(pta练习题)