
#include
"stdio.h"
struct
Node
{
Node
*pNext
int
value
}*pTop
struct
Node*
Insert(struct
Node
*pNode,int
Num)
void
Del(struct
Node
*pDelNode)
struct
Node*
Search(struct
Node
*pNode,int
Num)
void
main()
{
pTop=NULL
int
i,k,x,y
struct
Node
*pCurrentNode,*pTempNode
/*(1)建立带表头结点的单链表;*/
for(i=0i<30i++)
Insert(NULL,i)/*建立一个有30个结点的链表*/
/*(2)输出单链表中所有结点的数据域值;*/
pCurrentNode=pTop
while(pCurrentNode!=NULL)
{
printf("%d->",pCurrentNode->value)/*遍历这个链表并输出其各结点的数据域*/
pCurrentNode=pCurrentNode->pNext
}
/*(3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y*/
printf("Input
x,y")
scanf("%d,%d",&x,&y)
pCurrentNode=Search(NULL,x)
Insert(pCurrentNode,y)
/*(4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。
*/
printf("Input
k")
scanf("%d",&k)
pCurrentNode=pTop
i=0
while(1)
{
pTempNode=Search(pCurrentNode,x)
if(pTempNode!=NULL)
{
pCurrentNode=pTempNode->pNext
Del(pTempNode)
i++
}
else
break
}
printf("%d
Nodes
was
deleted",i)
pTempNode=pTop
while(pTop!=NULL)
{
pTop=pTempNode->pNext
delete
pTempNode
}
}
Node*
Insert(struct
Node
*pNode,int
Num)
{
struct
Node
*pNewNode
pNewNode=new
Node
pNewNode->value=Num
if(pNode==NULL)/*无确定插入位置时将结点放在链表最后*/
{
if(pTop!=NULL)/*确定链表是否是空表*/
{
pNode=pTop
while(pNode->pNext!=NULL)
pNode=pNode->pNext/*找到尾结点*/
pNode->pNext=pNewNode
}
else
{
pTop=pNewNode
}
pNewNode->pNext=NULL
}
else/*有确定插入位置时将结点放在指定结点之后*/
{
pNewNode->pNext=pNode->pNext
pNode->pNext=pNewNode
}
return
pNewNode
}
void
Del(struct
Node
*pDelNode)
{
if(pDelNode==NULL
||
pTop==NULL)
return/*防错处理*/
struct
Node
*pNode
pNode=pTop
while(pNode!=NULL
&&
pNode->pNext!=pDelNode)
pNode=pNode->pNext/*找到指定结点的前导结点*/
if(pNode!=NULL)
{
pNode->pNext=pDelNode->pNext
delete
pDelNode
}
}
struct
Node*
Search(struct
Node
*pNode,int
Num)
{
struct
Node
*pSeaNode
if(pNode==NULL)
pSeaNode=pTop/*不指定搜索的起始位置,从表头开始*/
else
pSeaNode=pNode/*指定了搜索的起始位置,从指定位置开始*/
while(pSeaNode!=NULL
&&
pSeaNode->value!=Num)
pSeaNode=pSeaNode->pNext
return
pSeaNode/*没有找到结点时返回空指针*/
}
建立一个单链表,实现插入与删除功能的代码如下:///单链表
#include<iostream>
using namespace std
typedef int elemtype //数据类型模版
struct Lnode //结点
{
elemtype data
Lnode *next
}
///建表
void creat_Link(Lnode &head)
{
Lnode *p,*q
int n
p=new Lnode
head=p
cout<<"输入链表长度:"<<endl
cin>>n
cout<<"输入数据:"<<endl
cin>>p->data
q=p
for(int i=1i<=n-1i++)
{
p=new Lnode
//cout<<"输入数据:"
cin>>p->data
q->next=p
q=p
}
q->next=NULL
}
///表的输出
void output_Link(Lnode *&head)
{
if(head==NULL)
{cout<<"空链表!"<<endl
return}
Lnode *q
q=head
//cout<<"此链表为:"
while(q!=NULL)
{
cout<<q->data<<" "
q=q->next
}
cout<<endl
}
///表的插入
void insert_Link(Lnode *&head)
{
int i
cout<<"输入要插入的位置:"
cin>>i
Lnode *q,*iq
q=head
for(int j=1j<ij++)
{
iq=q
q=q->next
}
cout<<"输入插入的数据:"
Lnode *p
p=new Lnode
cin>>p->data
p->next=iq->next
iq->next=p
cout<<endl
}
///表的数据删除
void Delete_Link(Lnode *&head)
{
cout<<"输入删除的位置:"
int i
cin>>i
if(i==1)
head=head->next
else
{
Lnode *p,*q
q=head
for(int j=1j<ij++)
{p=q
q=q->next
}
p->next=q->next
delete q
cout<<endl
}
}
int main()
{
Lnode *head
head=NULL
creat_Link(head)
insert_Link(head)
output_Link(head)
Delete_Link(head)
output_Link(head)
return 0
}
[扩展]
以“结点的序列”表示线性表称作线性链表(单链表),链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
#include <stdio.h>#include <stdlib.h>
#include <string.h>
typedef struct node{
char no[20]//存放编号
char name[40]//存放名称
int reserve//库存
struct node *next
}NODE
typedef struct link{
NODE *front//头指针
NODE *rear//尾指针
}LINK;
NODE *create_node(void){
NODE *node = (NODE *)malloc(sizeof(NODE))
printf("请输入货物编号:")
gets(node->no)
printf("请输入货物名称:")
gets(node->name)
printf("请输入货物名称:")
char ch
while( (ch= getchar()) != '\n')//rewind(stdin)
scanf("%d",&node->reserve)
node->next = NULL
return node
}
void init_link(LINK *link){
link->rear = NULL
link->front = NULL
}
int link_empty(LINK *link){
return link->front == NULL ? 1: 0
}
int node_num(LINK *link){
int num = 0
if( link_empty(link)){
return num
}
num = 1
NODE *node = link->front
while(node != link->rear){
node = node->next
++num
}
return num
}
/*NODE *node_find(LINK *link,const int n){
int num = node_num(link)
if(num < n){
printf("公有节点%d个,无法找到第%d个节点\n",num,n)
}
else{
}
}
*/
void node_push(LINK *link){
NODE *node = create_node()
if(link->front == NULL){
link->front = node
link->rear = node
node->next = NULL
}
else{
link->rear->next = node
link->rear = node
node->next = NULL
}
}
void node_insert(LINK *link,const int n){
int num = 0,i = 1
NODE *node = link->front
NODE *new_node = NULL
if ( link_empty(link) ){
printf("链表为空,将建立链表!\n")
node_push(link)
}
else{
if( n <= 1){
printf("在链表头插入数据\n")
new_node = create_node()
new_node->next = link->front
link->front = new_node
}
else if( n>= num = node_num(link) ){
printf("节点数少于%d,将在末尾插入节点.\n",n)
node_push(link)
}
else{
printf("在第n个节点后插入数据\n")
if(num >= n){
while( i != n){
node = node->next
++i
}
new_node = create_node()
new_node-next = node->next
node->next = new_node
}
}
}
void find_node_insert(LIKNK *link,const char *name){
NODE *node = link->front
if( link_empty(link) )
node_push(link)
else {
while(strcmp(node->name,name) != 0){
if(node != link->rear)
node = node->next
else break
}
if(node != NULL){
NODE *new_node = create_node()
new_node-next = node->next
node->next = new_node
}
else {
printf("没有找到相关货物,将在头节点插入数据\n")
intsert(link,0)
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)