C语言里的node,Node节点解决方法

Node节点

Node *p,*q;

q=l;

while(1)

{

p=(Node*)malloc(sizeof(Node));

if(!p)

{

printf("memory malloc fail\n");

return;

}

stringinput(p->data.name,15,"enter your name:");

if(strcmp(p->data.name,"0")==0)

break;

stringinput(p->data.tel,15,"enter your telephone:");

p->next = NULL;

q->next = p;

q = p;

}

能解释一下最后三条语句的意思吗?

------解决思路----------------------

仅供参考://带表头结点的单向链表

#include 

#include 

#include 

#include 

struct NODE {

int          data;

struct NODE *next;

} H,*head,*p,*q,*s1,*s2,*s3,*s4,*s;

int i,j,k,n,t,m;

int main() {

srand(time(NULL));

//填写头节点数据

H.data=-1;

H.next=NULL;

head=&H;

//创建10个节点的单链表

p=head;

for (i=0;i<10;i++) {

q=(struct NODE *)malloc(sizeof(struct NODE));

if (NULL==q) return 1;

q->data=rand()%100;//填写0..99的随机值

q->next=NULL;

p->next=q;

p=q;

}

//输出整个单链表

s=head->next;

while (1) {

if (NULL==s) {

printf("\n");

break;

}

printf("%02d->",s->data);

s=s->next;

}

//将值为5的结点插入到单链表的第k个结点前

k=3;

n=0;

p=head;

while (1) {

if (NULL==p) {

break;

}

n++;

if (k==n) {

q=(struct NODE *)malloc(sizeof(struct NODE));

if (NULL==q) return 1;

q->data=5;

q->next=p->next;

p->next=q;

break;

}

p=p->next;

}

//输出整个单链表

s=head->next;

while (1) {

if (NULL==s) {

printf("\n");

break;

}

printf("%02d->",s->data);

s=s->next;

}

//删除第k个节点

k=5;

n=0;

p=head;

while (1) {

if (NULL==p) {

break;

}

n++;

if (k==n) {

q=p->next;

if (q) {

p->next=q->next;

free(q);

}

break;

}

p=p->next;

}

//输出整个单链表

s=head->next;

while (1) {

if (NULL==s) {

printf("\n");

break;

}

printf("%02d->",s->data);

s=s->next;

}

//从小到大排序

for (p=head;p!=NULL && p->next!=NULL;p=p->next) {

for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {

if (p->next->data > q->next->data) {

//交换data

//              printf("swap %02d %02d\n",p->next->data,q->next->data);

//              t=p->next->data;p->next->data=q->next->data;q->next->data=t;

//或者

//交换next

//              printf("swap %02d %02d\n",p->next->data,q->next->data);

s1=p->next;

s2=p->next->next;

s3=q->next;

s4=q->next->next;

if (s2!=s3) {

p->next=s3;

s3->next=s2;

q->next=s1;

s1->next=s4;

} else {

p->next=s3;

s3->next=s1;

q=s3;

s1->next=s4;

}

//输出整个单链表

//              s=head->next;

//              while (1) {

//                  if (NULL==s) {

//                      printf("\n");

//                      break;

//                  }

//                  printf("%02d->",s->data);

//                  s=s->next;

//              }

//              getchar();

}

}

}

//输出整个单链表

s=head->next;

while (1) {

if (NULL==s) {

printf("\n");

break;

}

printf("%02d->",s->data);

s=s->next;

}

//将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10

m=4;

n=6;

k=0;

p=head;

while (1) {

if (NULL==p) {

break;

}

k++;

if (m+1==k) {

q=p;

}

s=p;

p=p->next;

}

s1=head->next;

head->next=q->next;

s->next=s1;

q->next=NULL;

//输出整个单链表

s=head->next;

while (1) {

if (NULL==s) {

printf("\n");

break;

}

printf("%02d->",s->data);

s=s->next;

}

//释放所有节点

p=head->next;

while (1) {

if (NULL==p) {

break;

}

q=p->next;

free(p);

p=q;

}

return 0;

}

//18->94->58->17->27->20->43->57->75->78->

//18->94->05->58->17->27->20->43->57->75->78->

//18->94->05->58->27->20->43->57->75->78->

//05->18->20->27->43->57->58->75->78->94->

//43->57->58->75->78->94->05->18->20->27->

//

------解决思路----------------------

下次自己画一画

194654101.png

------解决思路----------------------

自己画图其实就会很清楚了,先创造一个节点,然后将节点从原链表的L节点后面顺序插入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值