在数组中数据多的时候,插入和删除变的非常麻烦,引入链式存储就可以很容易。链表的结构如图所示,然后用C语言来把它实现。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int num;//4
float data;//4
struct Node *pNext;//4
}node;
void main()
{
node *pnode;//定义一个头结点
node node1, node2, node3;//定义三个结点
node1.num = 1;//对三个结点进行赋值
node2.num = 2;
node3.num = 3;
node1.data = 12.0;
node2.data = 13.0;
node3.data = 14.0;
pnode = &node1;//让头结点指向第一个结点
node1.pNext = &node2;//依次指向下一个结点
node2.pNext = &node3;
node3.pNext = NULL;//尾结点为空
printf("%d\n",pnode->num);
printf("%d\n", pnode->pNext->num);
printf("\n\n");
while (pnode != NULL)//循环输出
{
printf("%p,%p",pnode,pnode->pNext);
printf(" %d,%f\n",pnode->num,pnode->data);
pnode = pnode->pNext;
}
system("pause");
}
用函数来实现链表的增加、删除、查改、修改、排序、逆序六大操作。
/*
链表的实现
*/
#include<stdio.h>
#include<stdlib.h>
#define datatype int //用datatype来代替int类型
typedef struct node
{
int num;//数据域
datatype data;
struct node *pNext;//指针域,指向下一个结点
}Node;
//增加,删除,查改,修改,排序,逆转六大操作
void backaddnode(Node **pnode,int num,datatype data);//尾部增加结点
void showallnode(Node *pnode);
void main()
{
//定义一个头节点
Node *pnode=NULL;
backaddnode(&pnode, 1, 11);
backaddnode(&pnode, 2, 12);
backaddnode(&pnode, 3, 13);
backaddnode(&pnode, 4, 14);
backaddnode(&pnode, 5, 15);
showallnode(pnode);
system("pause");
}
void showallnode(Node *pnode)
{
printf("\n打印链表\n");
while (pnode !=NULL)
{
printf("%d,%d\n", pnode->num, pnode->data);
pnode = pnode->pNext;
}
}
void backaddnode(Node **ppnode, int num, datatype data)
{
Node *pnewnode = (Node*)malloc(sizeof(Node));
pnewnode->num = num;//赋值,新建一个节点
pnewnode->data = data;
pnewnode->pNext = NULL;//尾部
if (*ppnode == NULL)
{
*ppnode = pnewnode;//新建节点的地址
pnewnode->pNext = NULL;
}
else
{
Node *p = *ppnode;//等于头节点
while (p->pNext != NULL)//循环输出
{
p = p->pNext;//一直循环到最后一个节点
}
p->pNext = pnewnode;//新插入的节点
}
}
另外用返回值的一种写法
/*
链表实现的增加
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int num;
struct node *pNext;
}Node,*pNode;
pNode creat_list();
void showlist(pNode pHead);
void main()
{
pNode pHead = NULL;//定义一个头节点
pHead = creat_list();//创造一个链表
showlist(pHead);//显示链表数据
system("pause");
}
pNode creat_list()
{
int len;
int val;
pNode pHead=(pNode)malloc(sizeof(Node));//头节点分配内存
if (pHead == NULL)
{
printf("分配内存失败!");
exit(-1);//退出程序
}
else
{
pNode pTail = pHead;
pTail->pNext = NULL;
printf("please enter numbres: ");
scanf_s("%d", &len);
for (int i = 0; i < len; i++)
{
printf("please enter %d numbre: ",i+1);
scanf_s("%d", &val);
pNode pNewnode = (pNode)malloc(sizeof(Node));
pNewnode->num = val;//存放输入的值到数据域
pTail->pNext = pNewnode;//存放前一个节点的地址
pNewnode->pNext = NULL;
pTail = pNewnode;
}
}
return pHead;
}
void showlist(pNode pHead)
{
printf("打印链表\n");
pNode p = pHead->pNext;
while (p != NULL)
{
printf("%d ", p->num);
p = p->pNext;
}
printf("\n");
}