//之前学了数据结构,写了一些程序.久了不去应用,竟然忘记了链表是怎么操作的.今天重新翻了一下书,将链表的操作的程序贴出来,记忆一下,共享一下.
//本程序实现一般单链表的创建,插入,查找,删除,打印,反转链表。
#ifndef _Link_h
#define _Link_h
typedef struct NODE
{
int data;
struct NODE *next;
}node,*link; //注意:只是定义了结构体的类型,并没有定义变量
//初始化链表,创建头结点 ,成功与失败,均在屏幕上显示出来 。成功返回地址,失败返回Null
link InitList( char n );
// 插入新节点,参数:头结点,第i个位置,插入的数据
void ListInsert( link _head,int num,int _data);
//查找,返回第一个与输入数据一样的元素的位置,参数:头结点,数据。
link ListFind( link _head,int _data);
//删除
void ListDelet(link _head, int num );
//将链表打印到屏幕上
void PRINTF( link _head );
//反转链表
void RollBack( link _head );
#endif
#include<stdio.h>
#include<malloc.h>
#include"link.h"
//初始化链表,创建头结点 ,成功与失败,均在屏幕上显示出来 。成功返回地址,失败返回Null
link InitList( char n )
{
link head, p,s;
int i;
if( n < 0)
return NULL;
head = p = ( link )malloc( sizeof( node ) );
printf("请输入链表数据\n");
for( i = 0; i < n; i ++ )
{
s = ( link )malloc( sizeof ( node ) );
scanf("%d",&s->data);
p->next = s;
p = s;
}
p->next = NULL;
return head;
}
void ListInsert( link _head,int num,int _data)
{
link p;
p = _head;
char i;
for( i = 1; i <= num; i ++ )
{
p = p->next;
}
if( p == NULL )
{
printf("插入位置有误\n");
Lodesys(); //回到选择界面
}
link s = (link)malloc( sizeof( node ) );
s->data = _data;
s->next = p->next;
p->next = s;
printf("插入成功\n");
Lodesys();//回到选择界面
}
void PRINTF( link _head )
{
link p;
if( _head->next == NULL )
{
printf("链表为空\n");
Lodesys();//回到选择界面
}
p = _head->next;
printf("链表数据如下\n");
while( p->next != NULL )
{
printf(" %d ",p->data);
p = p->next;
}
printf(" %d ",p->data);
printf("\n");
}
void ListDelet(link _head, int num )
{
link p;
p = _head;
if( p->next == NULL )
{
printf("链表为空\n");
Lodesys();//回到选择界面
}
int i;//i = 2 这样寻找到的是要删除节点的前一个节点
for( i = 2; i <= num; i ++ )
{
p = p->next;
}
link p_temp = p->next; //保存之前的节点,为了更好的free掉
p->next= p->next->next;
free( p_temp );
printf("删除成功\n");
Lodesys();//回到选择界面
printf("删除失败,所要删除的位置大于链表的长度");
Lodesys();//回到选择界面
}
link ListFind( link _head,int _data)
{
link p;
p = _head->next;
while( ( p->data != _data ) && ( p->next != NULL ) )
p = p->next;
if(p->data == _data)
{
printf("寻找到了\n");
printf("%x\n",p);
Lodesys();//回到选择界面
}
printf("链表没有此元素");
Lodesys();//回到选择界面
}
void RollBack( link _head )
{
if( _head->next == NULL )
{
printf("链表为空");
Lodesys();//回到选择界面
}
link p,r,s;
p = r = _head->next; //循环从第一个结点开始,头结点因为其他操作要用到,故不能改变
s = p->next; //s保存下一个链表的地址,并判断是否到了最后结点
r->next = NULL; //链表的第一个元素反转之后变成最后一个元素,故其下一个元素为 NULL ,(注意:第一个结点的地址域不能再用)
while( s->next != NULL ) //如果没到最后一个结点
{
p = s; //p前进一个结点(注意,不可以用 P = P->next来前进,因为P->next为 NULL)
s = s->next; //s前进一个结点
p->next = r; //p->next指向上一个结点
r = p; //s前进一个结点
}
s->next = r; // 如果s是最后一个结点,则s->next指向上一个结点
head->next = s; // head->next指向最后一个结点,也就是反转后的第一个结点
printf("反转成功\n");
Lodesys();//回到选择界面
}
c语言链表操作
最新推荐文章于 2022-08-29 14:49:54 发布