【链表】不看你可能会后悔,看了你也可能会后悔!!!
本帖最后由 飞鸽 于 2013-4-3 20:58 编辑要是你看了,请继续看一下去 ,否则你别看了,如果你觉得有不对或者需要改进的地方请指出,我将接受各位的宝贵建议,学习就是交流的过程,无论怎样分享是一种快乐,如果你收获了,也跟我分享一下请赞一个,你们的肯定是我学习前进的动力。
不够专业解释的地方多多见谅#include <stdio.h>
#include <stdlib.h>
struct Node //结构体
{
int data;
Node *next; //下一个结构体的结点
};
Node *CreateLink()//创建链表
{
Node *h,*p,*q;
//定义指向Node的h,p,q指针变量,h代表头指针
//p代表永远指向尾结点的指针,q代表新结点
int num;
h=p=q=(Node *)malloc(sizeof(Node));
//起初h,q,p,都指向一个头指针,但头指针为空,什么都没有的结点
printf("请输入数据\n");
scanf("%d",&num);
while(num>0)//输入数据不为0时就作为结点
{
q=(Node *)malloc(sizeof(Node));//再申请一个新结点空间
q->data=num;//把数据存入结点
p->next=q;//这时p指向了新结点q,说白了就是链接结点
p=q;//这一步表示p要后移到下个结点,因为链接完结点,就有可能出现新结点, //p也就后移为指向新结点作准备
printf("请输入数据\n");//继续输入数据
scanf("%d",&num);
}
p->next=NULL;//相当关键,别忘了这一步,因为你的num不大于0时就不执行while的步骤了
//不执行while了意味着没有新的结点q,p也就成了最后一个结点,p要是没有后一个结点,那么
//输出链表的时候计算机就会出错误(编译时不会报错),所以就得有个指向空的结点作为链表结束标志
return h; //把结点都链接完了,就要把头抓住,因为链接了结点,就无须知道其中的结点了,只要把头指针告诉
//主函数就可以了,创建完的链表要怎么处理,主函数会有不同的命令
}
void PrintfLink(Node *h) //输出链表,别忘了把链表的头告诉给函数
{
Node *point; //把头抓住了,还得定义一个指向Node的指针变量point作为输出每一个结点
point=h->next;//头指针有数值吗?没有,所以得把头结点的下一个结点告诉给point
while(point!=NULL) //point不为空就输出咯
{
printf("%-3d",point->data);
point=point->next;//输出了point->data那么要输出下个结点的data就得把point后移是吧这样才能保证
//结点都输出
}
printf("\n");
}
void main()
{
Node *head;//定义一个指向Node的指针作为下面操作后返回的新的链表的头指针
head=CreateLink();//把创建链表后的头告诉给head
PrintfLink(head); //调用输出链表函数,别忘了形参是头指针
}
很好,可以帮助理解。怎么就没人顶呢,希望楼主继续 楼主写的好,清晰易懂,顶起 楼主写的不错,清晰易懂 为何不用链表类呢!不想自己写链表,不好操作,如果程序中自己写链表,不知道要占多少行代码,还不利于维护... 挺好 我想问,为什么不采用引用呢?? #include<stdio.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(List)
typedef struct node
{
int data;
struct node * next;
}List;
int n=0;
List *create(void)
{
List * head;
List * p1,* p2;
p1=(List*)malloc(LEN);
p2=(List*)malloc(LEN);
head=NULL;
puts("请输入要插入链表的数据(输入0结束):\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
n++;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(List*)malloc(LEN);
scanf("%d",&p1->data);
}
free(p1);
p2->next=NULL;
return head;
}
void Print(List * head)
{
List * p;
p=head;
if(head!=NULL)
do
{
printf("[%d]->",p->data);
p=p->next;
}while(p!=NULL);
}
int main()
{
int m;
List * head;
List * pa=(List*)malloc(LEN), *pb=(List*)malloc(LEN);
List * p1,*p2;
head=create();
Print(head);
printf("\n");
p1=head;
pa=p1;
p2=p1->next;
pb=p2;
while(p2->next!=NULL)
{
p1->next=p1->next->next;
p1=p2->next;
if(p1->next==NULL)
break;
p2->next=p2->next->next;
p2=p1->next;
}
p1->next=NULL;
p2->next=NULL;
Print(pa);
printf("NULL\n");
Print(pb);
printf("NULL\n");
//return 0;
scanf("%d", &m);
} 谢谢楼主分享 看起来不难,可是自己写就写不出来,,,,, 看著書寫就好了 学习,谢谢lz 注释很清楚啊 链表不难吧!需要这样来理解一下也不错!! 谢谢楼主这样分享 链表结构比数组简单点 真的不错,很详细哦。。。 很好很强大!!!! 很好,可以帮助理解。怎么就没人顶呢,希望楼主继续
页:
[1]