void create_node_fun(int n)
15 {
16 int i;
17 head = (NODE*)malloc(sizeof(NODE));
18 if(head == NULL)
19 {
20 printf(“head==NULL,error!!!”);
21 exit(0);
22 }
23 head->data = 0;
24 head->link = NULL;
25 NODE *p = NULL;
26 for(i = 0;i < n;i++)
27 {
28 p = (NODE *)malloc(sizeof(NODE));
29 p->data = i;
30 p->link = head->link;
31 head->link = p;
32 }
33 }
上面代码的30和31行代码:把第一次开辟出来的节点称为p1,第二次开辟出来的节点称为p2,那这两行不就表示p1->link = head->link; head->link = p1; 然后到第二个节点的时候就变成这样了: p2->link = p1; p1 = p2。
这样理解不知道对不对,反正本人感觉很奇怪,应该是不对的,但是不清楚,所以讨教一下各位高手。
还有,本人看到网上有人是专门是有开辟一个新的节点,叫做尾指针,专门用来指向链表的结尾的。不知道这两种方法哪种可用性高点。
15 {
16 int i;
17 head = (NODE*)malloc(sizeof(NODE));
18 if(head == NULL)
19 {
20 printf(“head==NULL,error!!!”);
21 exit(0);
22 }
23 head->data = 0;
24 head->link = NULL;
25 NODE *p = NULL;
26 for(i = 0;i < n;i++)
27 {
28 p = (NODE *)malloc(sizeof(NODE));
29 p->data = i;
30 p->link = head->link;
31 head->link = p;
32 }
33 }
上面代码的30和31行代码:把第一次开辟出来的节点称为p1,第二次开辟出来的节点称为p2,那这两行不就表示p1->link = head->link; head->link = p1; 然后到第二个节点的时候就变成这样了: p2->link = p1; p1 = p2。
这样理解不知道对不对,反正本人感觉很奇怪,应该是不对的,但是不清楚,所以讨教一下各位高手。
还有,本人看到网上有人是专门是有开辟一个新的节点,叫做尾指针,专门用来指向链表的结尾的。不知道这两种方法哪种可用性高点。
解决方案
10
head为链表的头指针,保持在头部不变。第二次生成一个节点仍旧是放到head的后面,相当于 p2->link=head->link;head->link=p2;
10
仅供参考:
//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE { int data; struct NODE *next; } H,*head,*p,*q,*q1,*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; } //将整个链表逆序 if (head->next!=NULL && head->next->next!=NULL) { p=head->next; q=p->next; p->next=NULL; while (1) { q1=q->next; q->next=p; p=q; q=q1; if (NULL==q) break; } head->next=p; } //输出整个单链表 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; } //84->28->20->23->96->19->59->97->29->41-> //84->28->05->20->23->96->19->59->97->29->41-> //84->28->05->20->96->19->59->97->29->41-> //05->19->20->28->29->41->59->84->96->97-> //97->96->84->59->41->29->28->20->19->05-> //41->29->28->20->19->05->97->96->84->59-> //
10
p->link = head->link;
p是刚刚malloc出来的结点,让p->link指向head的link结点(即第一个结点),这句实现了将新结点的link指针指向第一个结点
head->link = p;
这句使head的link指针指向新结点p,实现了新节点的插入(头插法)
p是刚刚malloc出来的结点,让p->link指向head的link结点(即第一个结点),这句实现了将新结点的link指针指向第一个结点
head->link = p;
这句使head的link指针指向新结点p,实现了新节点的插入(头插法)
10
head 指向 p1 指向null
head 指向 p2 再指向 p1
同是小白。
15