编写单链表程序:
程序1:main函数
1 #include <stdio.h>
2 #include "./03_linklistFunc.h"
3
4 int main(int argc, const char *argv[])
5 {
6 Linklist* head;
7 head = create_linklist();
8
9 insert_linklistByHead(head, 100); //100
0 insert_linklistByHead(head, 200); //200 100
1 insert_linklistByHead(head, 300); //300 200 100
2 show_linklist(head);
3
4 insert_linklistByWei(head, 666); //300 200 100 666
5 insert_linklistByWei(head, 999); //300 200 100 666 999
6 show_linklist(head);
7
8 delete_linklistByHead(head);
9 show_linklist(head); //200 100 666 999
0 delete_linklistByHead(head);
1 show_linklist(head); //100 666 999
2 delete_linklistByHead(head);
3 show_linklist(head); //666 999
4
5 return 0;
6 }
程序2:头文件包含
1 #ifndef __LINKLIST__
2 #define __LINKLIST__
3
4 typedef int datatype;
5 typedef struct lklst
6 {
7 union
8 {
9 int len; //若是头结点,则用len存储链表长度
10 datatype data; //若是有效数据结点,则用data存放有效数据
11 }text; //数据域
12
13 struct lklst* next;//指针域,指向下一个结点,存储下一个结点的首地址
14 }Linklist;
15
16 //创建一个空的单链表
17 Linklist* create_linklist(void);
18 //头插法插入数据
19 void insert_linklistByHead(Linklist* head, datatype num);
20 //尾插法插入数据
21 void insert_linklistByWei(Linklist* head, datatype num);
22 //头删法删除数据
23 datatype delete_linklistByHead(Linklist* head);
24 //尾删法删除数据
25 //遍历链表
26 void show_linklist(Linklist* head);
27
28 #endif
程序3:功能函数
#include <stdio.h>
#include <stdlib.h>
#include "./03_linklistFunc.h"
//创建一个空的单链表
Linklist* create_linklist(void)
{
//在堆空间中申请了头结点的空间,头结点的首地址存储在head指针中
//head指针就是头指针
Linklist* head = (Linklist*)malloc(sizeof(Linklist));
if(NULL == head)
{
printf("创建单链表失败\n");
return NULL;
}
//初始化头结点中的len
head->text.len = 0;
head->next = NULL;
return head;
}
//头插法插入数据
void insert_linklistByHead(Linklist* head, datatype num)
{
//创建一个新的结点temp
Linklist* temp = (Linklist*)malloc(sizeof(Linklist));
if(NULL == temp)
{
printf("创建结点失败,头插失败\n");
return ;
}
temp->text.data = num; //数据域赋值
temp->next = NULL; //指针域赋值
//将temp头插法插入链表
temp->next = head->next;
head->next = temp;
//更新头结点中链表的长度
head->text.len++;
return ;
}
//尾插
void insert_linklistByWei(Linklist* head, datatype num)
{
//创建一个新的结点temp
Linklist* temp = (Linklist*)malloc(sizeof(Linklist));
if(NULL == temp)
{
printf("创建结点失败,尾插失败\n");
return ;
}
temp->text.data = num; //数据域赋值
temp->next = NULL; //指针域赋值
//找尾结点p的位置:循环判断p->next是否为NULL
Linklist* p=head;
while(NULL != p->next)
{
p=p->next;
}
//将temp尾插法插入链表
temp->next=NULL; //或者temp->next=p->next;
p->next=temp;
//更新头结点中链表的长度
head->text.len++;
return ;
}
//头删
datatype delete_linklistByHead(Linklist* head)
{
//先判断链表是否为NULL
if(NULL == head->next)
{
printf("链表为空,头删除失败\n");
}
//备份要释放的结点地址
Linklist* temp =head->next;
//修改head指针域中的地址,为要释放的结点的后一个结点的地址
head->next=temp->next; //或者head->next = head->next->next;
//保存要释放的结点数据域中存储的数据,作为验证
datatype num = temp->text.data;
//释放结点,防止temp变野指针,指向NULL
free(temp);
temp=NULL;
//更新头结点中链表的长度
head->text.len++;
return num;
}
//遍历链表
void show_linklist(Linklist* head)
{
Linklist* p = head;
while(p->next != NULL)
{
p=p->next;
printf("%d ", p->text.data);
}
putchar(10);
return ;
}