做学校作业,那个烂网站我真是无语了。
附上代码。
感想:使用scanf函数的时候,%s是一个特殊情况,因为s意味着一个数组,因此在最开始的结构体定义中,需要将数据类型定义为数组类型,char*data【2】的形式。
其次,因为学校的奇奇怪怪的要求,学到了strcmp()函数,以及对多个字符组成的输入应该使用%s,而且scanf函数可以不用加&,本身就是地址。
还有,遇到类型数据比较的时候,我使用的是devc++,编译器报错的时候要考虑强制类型转换的问题,指针是指针型,类似于(char*)的形式。
最后,学到了链表创建时候的尾插法,头节点和其余节点应分开写函数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//还要再改,只有一次输入
//指针运行中是可以迭代的,head赋给q,再次用p给q赋值,也就是指针赋值的迭代来完成链表的创建
//问题出在了打印上
typedef struct Node{
char *data[1];
struct Node*next;
}Node;
//创立头节点
Node*start(Node*head){
head=(Node*)malloc(sizeof(Node));
head->next=NULL;
return head;
}
//创立节点
Node* create(Node*head){
Node*tail,*p;//tail就是尾节点,p就是中间节点
tail=head;
int i=0;//i表示建立链表的长度
for(i=0;i<5;i++){
p=(Node*)malloc(sizeof(Node));
scanf("%s",p->data);
//getchar();
tail->next=p;
tail=p;
}
tail->next=NULL;
}
void delete_x(Node*head){
Node*p,*pre;
pre=p=head;
while(1){//但是最后一个p的值没有打印出来以及头指针的值也被打印出来了
//碰到x就跳过,这个为相等的情况,且该情况为x在中间
//头节点的单独处理,还没有考虑第一个元素,最后一个元素,以及整组都是x的情况
if(p==head){
p=p->next;
//在此处把第一个元素,以及整个组都是x考虑到的情况剔除掉
while(strcmp((char*)p->data,"x")==0){
pre->next=p->next;
free(p);
p=pre->next;
if(p->next==NULL){
printf("");
return;
}
}
}
//是x的情况
if(strcmp((char*)p->data,"x")==0){
//最后一个元素是x的情况
if(p->next==NULL){
return;
}
pre->next=p->next;
free(p);
p=pre->next;
}
//不是的情况
else{
printf("%s ",p->data);
if(p->next==NULL){
return;
}
pre=p;
p=p->next;
//这个是为了打印最后一个元素
if(p->next==NULL){
if(strcmp((char*)p->data,"x")==0){
return;
}
printf("%s ",p->data);
break;
}
}
}
}
int main(){
Node *head;
head=start(head);
create(head);
delete_x(head);
return 0;
}