链表的定义:链表是一种动态的数据结构。它是动态进行存储分配的一种结构。
链表具有的特点:
在链表中,所有元素都分别保存在一个具有相同数据结构的节点中,节点是链表的基本存储单位,一个节点与一个数据元素对应。每个节点在内存中使用一块连续的存储空间,每个节点可以使用不连续的存储空间,节点通过指针连载一起,链接节点的指针叫链。
节点定义采用结构体类型:
struct node typedef struct node
{ {
datatype data; datatype data;
struct node *link; struct node *link;
}; }NODE; ------------->可以有个指针 如 *PNODE
可以有多个不同的datatype data,
链表的组成成员包括:头指针,表头节点,数据节点。
链表的创建方法一:在最后一个节点的尾部添加节点,输出的时候就是先进先出了
typedef struct node
{
char pdata[20];
struct node *pnext;
}NODE;
//NODE *head;如果在这里定义head的话,编译没有问题,但是运行的时候会出现内存使用不当的错误,所以head在main函数中定义。
void create_node_fun(NODE *phead)
{
int len,i;
char st[20];
NODE *ptail = phead; //ptail始终指向链尾
NODE *p;
printf("please input node len = ");
scanf("%d",&len); //确定链表的长度
for(i=0;i<len;i++)
{
p = (NODE *)malloc(sizeof(NODE));//申请一个数据节点
if(p == NULL) //判断申请节点是否成功
{
printf("p == NULL,error!!");
exit(-1);
}
else
{
scanf("%s",st); //应该可以直接输入到p->pdata中去的,没试过
strcpy(p->pdata,st);
ptail->pnext = p;
p->pnext = NULL;
ptail = p; //这三行代码基本上是固定的套路,一般来说可以直接套用就可以了
}
}
}
创建链表方法二:一直都是在表头的尾部插入新的节点,输出的时候就是后进先出了
typedef struct node
{
int data;
struct node *link;
}NODE;
void create_node_fun(int n)
{
int i;
NODE *head;
head = (NODE*)malloc(sizeof(NODE));
if(head == NULL)
{
printf("head==NULL,error!!!");
exit(-1);
}
head->data = 0;
head->link = NULL;
NODE *p = NULL;
NODE *ptail = NULL;
ptail = head;
for(i = 0;i < n;i++)
{
p = (NODE *)malloc(sizeof(NODE));//这里也是需要判断p是否申请空间成功,否则出现错误难找。
p->data = i;
p->link = head->link;
head->link = p; //这两句基本是固定的套路,可以直接套用
}
}
链表的输出方式一:
void printf_node_fun(NODE *head)
{
phea (NODE *)malloc(sizeof(NODE));
NODE *p = head;
while(p!=NULL)
{
printf("%s\n",p->pdata);
p = p->pnext;
}
}
链表的输出方式二:
void printf_node_fun(NODE *head)
{
NODE *p = NULL;
p = head;
if(head != NULL)
do
{
printf("%d",p->data);
p = p->link;
}while(p!=NULL);
}
其实这两种输出方法都一样,只不过循环方式不一样。
{
NODE *p,*q;
p = head;
q = head->pnext;
while(p!=NULL)
{
free(p);
p = q;
if(q!=NULL)
q=q->pnext;
}
}