用C语言编程:创建一个链表 并在该链表的任意位置实现添加和删除的功能,要求在同一个程序中完成!

用C语言编程:创建一个链表 并在该链表的任意位置实现添加和删除的功能,要求在同一个程序中完成!,第1张

以前给别人做的一个链表,给你用功能富裕了你看看吧:

#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)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11768497.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存