单链表基础【C语言】
编写一个由多个函数 构成的完整程序 ,实现单链表 的初始化 、建立 、按照内容查找 、插入节点 、删除节点 、显示整个链表的操作。
#include <stdio.h>
#include <stdlib.h>
#define elemtype char
typedef struct Node
{
elemtype data;
struct Node * next;
} Node;
typedef Node* Linklist;
void Initlist ( Linklist * L)
{
* L= ( Linklist) malloc ( sizeof ( Node) ) ;
( * L) -> next= NULL ;
}
void CreateFromTail ( Linklist L)
{
char c;
Node * r= L, * s;
scanf ( "%s" , & c) ;
while ( c!= '$' )
{
s= ( Node* ) malloc ( sizeof ( Node) ) ;
s-> data= c;
r-> next= s;
r= s;
scanf ( "%s" , & c) ;
}
r-> next= NULL ;
}
void CreateFromHead ( Linklist L)
{
Node * i;
elemtype x;
scanf ( "%s" , & x) ;
while ( x!= '$' )
{
i= ( Node * ) malloc ( sizeof ( Node) ) ;
i-> data= x;
i-> next= L-> next;
L-> next= i;
scanf ( "%s" , & x) ;
}
}
void InsList ( Linklist L, int i, elemtype e)
{
Node * pre, * s;
pre= L;
int k= 0 ;
while ( pre!= NULL && k< i- 1 )
{
pre= pre-> next;
k= k+ 1 ;
}
if ( pre== NULL )
{
printf ( "插入位置不合理!" ) ;
return ;
}
s= ( Node* ) malloc ( sizeof ( Node) ) ;
s-> data= e;
s-> next= pre-> next;
pre-> next= s;
}
void DelList ( Linklist L, int i)
{
Node * pre, * r;
pre= L;
int k= 0 ;
while ( pre-> next!= NULL && k< i- 1 )
{
pre= pre-> next;
k= k+ 1 ;
}
if ( pre-> next== NULL )
{
printf ( "该位置不合理!\n" ) ;
return ;
}
r= pre-> next;
pre-> next= r-> next;
free ( r) ;
printf ( "已释放此结点!\n" ) ;
}
void Locate ( Linklist L, elemtype key)
{
Node * p;
p= ( Node* ) malloc ( sizeof ( Node) ) ;
p= L-> next;
while ( p!= NULL )
{
if ( p-> data!= key)
{
p= p-> next;
}
else
{
printf ( "TA在此链表中!\n" ) ;
return ;
}
}
printf ( "没有找到TA!\n" ) ;
}
void view ( Linklist L)
{
printf ( "此链表为:\n" ) ;
Node * p;
p= L-> next;
while ( p!= NULL )
{
printf ( "%c " , p-> data) ;
p= p-> next;
}
printf ( "\n" ) ;
}
int main ( )
{
Linklist L;
Initlist ( & L) ;
printf ( "请您输入--元素的总个数:\n" ) ;
int m; scanf ( "%d" , & m) ;
printf ( "若使用头插法请输入--'H'\n" ) ;
printf ( "若使用尾插法请输入--‘T’\n" ) ;
char I; scanf ( "%s" , & I) ;
printf ( "请您输入--元素(最后以‘$’结束):\n" ) ;
if ( I== 'H' ) CreateFromHead ( L) ;
else CreateFromTail ( L) ;
view ( L) ;
printf ( "您想查找的元素为:\n" ) ;
elemtype key; scanf ( "%s" , & key) ;
Locate ( L, key) ;
printf ( "插入结点--您想把一个结点插入在哪个结点前面?\n" ) ;
printf ( "请您输入--该节点的序号:\n" ) ;
int N; scanf ( "%d" , & N) ;
printf ( "您想插入的元素为:\n" ) ;
elemtype e; scanf ( "%s" , & e) ;
InsList ( L, N, e) ;
printf ( "删除结点--您想删除哪一个结点?\n" ) ;
printf ( "请您输入--该节点的序号:\n" ) ;
int M; scanf ( "%d" , & M) ;
DelList ( L, M) ;
view ( L) ;
printf ( "Hello, World!\n" ) ;
return 0 ;
}
请您输入-- 元素的总个数:
3
若使用头插法请输入-- 'H'
若使用尾插法请输入-- ‘T’
T
请您输入-- 元素( 最后以‘$’结束) :
a b c $
此链表为:
a b c
您想查找的元素为:
b
TA在此链表中!
插入结点-- 您想把一个结点插入在哪个结点前面?
请您输入-- 该节点的序号:
2
您想插入的元素为:
e
删除结点-- 您想删除哪一个结点?
请您输入-- 该节点的序号:
4
已释放此结点!
此链表为:
e a b
Hello, World!
Process returned 0 ( 0x0 ) execution time : 45.395 s
Press any key to continue .
Copyright © 2019 wyq. All rights reserved.