1、什么是单向链表(单链表结构)?
线性表的链式存储结构,即链表。
将线性表L=(a0,a1,……,an-1)中各元素分布在存储器的不同存储块,称为结点,通过地址或指针建立它们之间的联系,所得到的存储结构为链表结构。
百度百科单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;
列表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向nuLL的指针。
2、单向链表如何逆序?
例如:建立一个包含若干整数的单向链表,实现数据的逆转。(比如说把1,2,3,4,5逆转成5,4,3,2,1)
实现思路:可以通过一个空链表来实现
程序自定义头文件
#ifndef __MYHEAD_H__
#define __MYHEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//定义宏
#define datatype int
//定义结构体
typedef struct link_list {
datatype num;
struct link_list * next;
}linkList,*pLinkList;
//函数声明
extern void linklist_init(pLinkList *Q); /*初始化*/
extern void linklist_insert(pLinkList p,pLinkList newone); /*插入*/
extern bool linklist_delete(pLinkList p); /*删除*/
extern bool is_empty(pLinkList p); /*判断*/
extern void linklist_show(pLinkList p); /*遍历*/
extern void linklist_inverse(pLinkList p); /*反转*/
extern void linklist_create(pLinkList h); /*创建*/
#endif
未逆序时代码:
#include "myhead.h"
/**
* 初始化
* @Author AWEEN
* @CreateTime 2018/5/17 15:26
*/
void linklist_init(pLinkList *Q){
*Q = (pLinkList)malloc(sizeof(linkList));
if(NULL == *Q){
perror("malloc failed");
exit(1);
}
(*Q)->next = NULL;
}
/**
* 插入
* @Author AWEEN
* @CreateTime 2018/5/17 15:33
*/
void linklist_insert(pLinkList p,pLinkList newone){
newone->next = p->next;
p->next = newone;
}
/**
* 删除
* @Author AWEEN
* @CreateTime 2018/5/17 15:36
*/
bool linklist_delete(pLinkList p){
pLinkList t;
//判断
if(p->next == NULL)
{
printf("删除失败。表已空\n");
return false;
}
//删除算法
t = p->next;
p->next = t->next;
#if 0
free(t);
t = NULL;
#endif
return true;
}
/*判断*/
bool is_empty(pLinkList p){
if(p->next == NULL)
return true;
else
return false;
}
/*遍历*/
void linklist_show(pLinkList head){
pLinkList t;
for(t=head->next;t!=NULL;t=t->next)
printf("%d\t",t->num);
printf("\n");
}
//创建一个链表
void linklist_create(pLinkList h)
{
int n,i;
pLinkList new,p=h;
printf("请输入你要创建的链表个数:");
scanf("%d",&n);
for(i=0;i<n;i++) {
new = (pLinkList)malloc(sizeof(pLinkList));
if(NULL == new) {
perror("new malloc failed");
exit(1);
}
printf("请输入一个新数据:");
scanf("%d",&new->num);
//将新节点插入到链表中
linklist_insert(p,new);
//每插入依次,往后移动一下
p = p->next;
//每插入一次 查看一次
linklist_show(h);
}
}
Makefile:
CC=gcc
CFLAGS = -Wall -g -O0
SRC = mian.c link_list.c
BIN = mian
$(BIN):$(SRC)
$(CC) -o $(BIN) $(SRC)
clean:
$(RM) $(BIN) .*.sw?
实现逆序的函数:
/*反转*/
void linklist_inverse(pLinkList h){
//将原链表分成两个表,一个空表,一个数据表
pLinkList p,t;
p = h->next; /*数据表*/
h->next = NULL; /*空表*/
while(p != NULL){
t = p;
p = p->next;
linklist_insert(h,t);
linklist_show(h);
}
}
程序测试:
#include "myhead.h"
int main() {
pLinkList head;
linklist_init(&head);
linklist_create(head);
linklist_inverse(head);
return 0;
}
结果输出: