1.静态链表
创建
struct Node{
int data;//数据域
struct Node* next;//指针域
};
struct Node Node1={1,Null};
struct Node Node1={1,Null};
Node1.next= &Node2;
2.动态创建链表
动态内存申请+模块化设计(创建一个表头表示整个链表)
//创建表头
struct Node* createList(){
struct Node* headNode=(struct Node*)malloc(sizeof(struct Node));//动态内存申请
//headNode成为了结构体变量,变量在使用前必须被初始化
headNode->next=Null;
return headNode;
}
//创建节点
struct Node* createNode(int data){
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
3.插入(头插法)
打印节点(遍历)
//打印
void printList(struct Node* headNode){
struct Node* pMove = headNode->next;
while(pMove){
printf("%d",pMove->data);
pMove = pMove->next;
}
printf("\n");
}
//插入
void insertNodeByHead(struct Node* headNode,int data){
struct Node* newNode = createNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
}
4.删除(指定位置删除)
void deleteNodeByappoin(struct Node* headNode,int posData)
{
struct Node* posNode = headNode->next;
struct Node* posNodeFront = headNode;
if(posNode == NULL)
printf("节点为空,不可删除!\n");
else
{
while(posNode->data != posData)
{
posNodeFront = posNode;
posNode = posNodeFront->next;
if(posNode == NULL)
{
printf("找不到相关信息,无法删除!");
return;
}
}
posNodeFront->next = posNode->next;
free(posNode);
}
}
5.实际应用
在实际应用中,如果需要处理的数据是一个结构体数据,这个时候data表示的数据域就是我们需要处理的结构体,我们操作的是一个结构体的数据
例如定义一个学生信息系统结构体
然后将data表示的数据更改为struct student data类型的数据
删除可以根据学生的num进行删除
打印相关信息
main函数内容:
首先定义一个临时的学生系统结构体变量
再根据while循环,录入学生信息结构体,插入到列表中
可能会产生跳步现象,因为存在scanf()的地方,可能就会出现跳步现象
解决办法:在scanf()语句后加入清空缓冲池语句
文本类型不匹配错误,输入n后仍然显示输入信息
因为choice的类型为int,无法与char类型进行比较