C语言创建单链表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
int data
node * next
}node , * List
void create(int n)
{
int c
List s,L
L=(List)malloc(sizeof(node))
L->next=NULL
printf("请输入第1个数据:")
scanf("%d",&c)
L->data=c
for(int i=2i<=ni++)
{
s=(List)malloc(sizeof(node))
printf("请输入第%d个数据:",i)
scanf("%d",&c)
s->data=c
s->next=L
L->next =s
}
printf("链表创建成功!")
}
void main()
{
int n
printf("请你输入链表的个数:")
scanf("%d",&n)
create(n)
}
单链表创建方法:
单链表的建立有头插法、尾插法两种方法。
1. 头插法
单链表是用户不断申请 存储单元和改变链接关系而得到的一种特殊 数据结构,将链表的左边称为链头,右边称为链尾。头插法建单链表是将链表右端看成固定的,链表不断向左延伸而得到的。头插法最先得到的是尾结点。
由于链表的长度是随机的,故用一个while循环来控制链表中结点个数。假设每个结点的值都大于O,则循环条件为输入的值大于o。申请 存储空间可使用malloc()函数实现,需设立一申请单元 指针,但malloc()函数得到的指针并不是指向 结构体的指针,需使用 强制类型转换,将其转换成结构体型指针。刚开始时,链表还没建立,是一空链表,head 指针为NULL。
链表建立的过程是申请空间、得到数据、建立链接的循环处理过程。
2. 尾插法
若将链表的左端固定,链表不断向右延伸,这种建立链表的方法称为尾插法。尾插法建立链表时,头 指针固定不动,故必须设立一个搜索指针,向链表右边延伸,则整个算法中应设立三个链表指针,即头指针head、搜索指针p2、申请单元指针pl。尾插法最先得到的是 头结点。
#include <stdio.h>#include <stdlib.h>
typedef int DataType
typedef struct node {
DataType member
struct node *next
}*LinkList, *pNode
// 初始化链表
LinkList GetEmptyList() {
LinkList head = (pNode)malloc(sizeof(struct node))
head->member = 0
head->next = NULL
return head
}
// 在非增链表中插入结点
void InsertNode(LinkList head, DataType x) {
pNode p,q
for(p = head p->next != NULL p = p->next) {
if(p->next->member <= x) {
q = (pNode)malloc(sizeof(struct node))
q->member = x
q->next = p->next
p->next = q
return
}
}
q = (pNode)malloc(sizeof(struct node))
q->member = x
q->next = p->next
p->next = q
}
// 新结点插入为首结点
void PushNode(LinkList head, DataType x) {
pNode p = (pNode)malloc(sizeof(struct node))
p->member = x
p->next = head->next
head->next = p
}
// 删除结点
int DeleteNode(LinkList head, DataType x) {
pNode p,q
for(p = head p != NULL p = p->next) {
if(p->next->member == x) {
q = p->next
p->next = q->next
free(q)
return 1 // 成功删除member(第一个)为x的结点
}
}
return 0 // 没有找到member为x的结点
}
// 查找结点
int FindNode(LinkList head, DataType x) {
pNode p
for(p = head->next p != NULL p = p->next) {
if(p->member == x) return 1 // 找到了
}
return 0 // 没有找到
}
// 销毁链表
void DestroyList(LinkList head) {
pNode q,p = head
while(p) {
q = p
p = q->next
free(q)
}
head = NULL
}
// 遍历链表
void ShowList(LinkList head) {
pNode p = head->next
while(p != NULL) {
printf("%d ",p->member)
p = p->next
}
printf("\n")
}
int main() {
DataType x,res
LinkList head = GetEmptyList()
printf("输入一个整数('q' to quit): ")
while(scanf("%d",&x) == 1) {
InsertNode(head, x) // 创建非增链表
printf("输入一个整数('q' to quit): ")
}
fflush(stdin)
ShowList(head)
printf("输入待查找的整数: ")
scanf("%d",&x)
res = FindNode(head, x)
if(res) printf("找到了。\n")
else printf("没找到!\n")
printf("输入待删除的整数: ")
scanf("%d",&x)
res = DeleteNode(head, x)
if(res) printf("成功删除。\n")
else printf("没找到数据为:%d的结点!\n",x)
ShowList(head)
DestroyList(head)
return 0
}
注意代码位置。
1)先声明,再定义
void getInput(struct Book* book)
struct Book
{
char title[128]
char author[40]
struct Book* next
}
2)有问题的3个函数:
//获取书籍信息
void getInput(struct Book* book)
{
printf("请输入书名:")
scanf_s("%s", book->title, 127)
printf("请输入作者:")
scanf_s("%s", book->author, 39)
}
//打印书籍
void printLibrary(struct Book* library)
{
struct Book* book
int count = 1
book = library
while (book != NULL)
{
printf("Book:%d\t:", count)
printf("书名:%s\t", book->title)
printf("作者:%s\n", book->author)
book = book->next
count++
}
}
//释放内存空间
void releaseLibrary(struct Book* library)
{
struct Book* temp
while (library != NULL)
{
temp = library->next
free(library)
library = temp
}
}