题目描述
对于初学链表的小小白,终于自己用c写出了一个链表的题,写个题解纪念一下,代码可能不是很简洁,望大家见谅(第一次用acwing,不太会排版)
C 代码
include[HTML_REMOVED]
include[HTML_REMOVED]
typedef struct ListNode {
int id;
int val;
struct ListNode *next;
}Node;
//创建链表
Node creat(Node head,int num)
{
struct ListNode p,q;
int i;
for(i=0;i<num;i++)
{
p=(struct ListNode *)malloc(sizeof(struct ListNode));
p->val=i+1;
p->id=1; //都设为有效的
if(i==0) //创建头结点
{
head=p;
p->next=NULL;
q=head;
}
else if(i==1) //创建头结点的下一个
{
head->next=p;
p->next=NULL;
q=p;
}
else //其余节点
{
q->next=p;
p->next=NULL;
q=p;
}
}
q->next=head;
return head;
}
//删除链表节点
Node del(Node head,Node p)
{
Node node,*q;//node用来遍历,q用来指代要删除的节点
if(p==head) //要删掉头结点
{
for(node=head;node->next!=head;node=node->next); //找到尾结点
node->next=head->next; //用尾结点的后继指向头结点的后继
q=head; //q指向头结点
head=head->next; //成立新的头结点
free(q) ;
}
else if(p->next==head) //尾
{
for(node=head;node->next->next!=head;node=node->next); //找到尾结点的前驱
q=node->next; //找到要删除的点
node->next=head; //用尾结点的前驱指向头结点
free(q) ;
}
else //普通节点
{
for(node=head;node->next!=p;node=node->next); //找到尾结点
q=p;
node->next=p->next;
free(q);
}
return head;
}
/清除循环链表/
int kill(Node l)
{
Node p,*q;
p = l->next;
if( p == l ) return 0; //空表返回0
while( p != l)
{
q=p->next;
free(p);
p=q;
}
p->next = l; // 循环链空表是指向头结点
return 1;
}
int main()
{
Node head,p;
int num,i=0,all,n;
scanf(“%d”,&all);
for(n=0;n<all;n++)
{
scanf(“%d”,&num);
head=NULL;
head=creat(head,num);
for(p=head;num>1;p=p->next)
{
if(p->id==1)
{ i++;
if(i%3==0)
{
printf("%d ",p->val);
p->id=0;
num--;
}
}
else
continue;
}
for(p=head;p->id==0;p=p->next);
printf("%d\n",p->val);
kill(head);
}
}