单链表的创建以及操作
/*************************单链表的创建以及使用**********************************/#include <stdio.h>
#include <stdlib.h>
/********************单链表******************************/
struct linknode /*链表结构声明*/
{
int data; /*存储结点数据*/
struct linknode *next; /*指向下一个结点*/
};
typedef struct linknode LinkNode; /*定义新类型*/
/***********************单链表的创建***************************/
LinkNode *CreatLinkNode() /*链表的创建*/
{
int i;
LinkNode *head,*ptr,*p; /*链表结点*/
head = (LinkNode *) malloc(sizeof(LinkNode)); /*分配内存*/
if(!head) /*检查指针内存是否分配成功*/
{
printf("内存分配失败!\n");
exit(1); /*退出*/
}
printf("请输入第1个数据:");
scanf("%d",&head->data ); /*创建结点内容*/
head->next=NULL; /*设置指针初值*/
ptr=head; /*ptr指向链表开始*/
for(i=1;i<5;i++) /*循环创建结点*/
{
p=(LinkNode *) malloc(sizeof(LinkNode));
if(!p)
{
printf("内存分配失败!\n");
exit(1);
}
printf("请输入第%d个数据:",i+1);
scanf("%d",&p->data );
p->next=NULL;
ptr->next = p; /*连接结点*/
ptr=ptr->next; /*指向下一个结点*/
}
return head;
}
/***********************单链表遍历***************************/
LinkNode *FindNode(LinkNode *head, int num) /*链表的遍历*/
{
LinkNode *ptr;
ptr=head; /*指向链表起始*/
while(ptr!=NULL) /*遍历链表*/
{
if(ptr->data == num)return ptr; /*查找编号*/
ptr=ptr->next ; /*指向一下结点*/
}
return ptr;
}
/************************单链表的插入**************************/
LinkNode *InsertNode(LinkNode *head,LinkNode *ptr,int vlaue) /*链表结点的插入*/
{
LinkNode *newnode=(LinkNode *)malloc(sizeof(LinkNode)); /*分配内存*/
if(!newnode)return NULL;
newnode->data=vlaue; /*创建结点内容*/
newnode->next=NULL; /*设置指针初值*/
if(ptr==NULL)
{
newnode->next=head; /*新结点称为链表开始*/
return newnode;
}
else
{
if(ptr->next == NULL)ptr->next = newnode; /*是否是链表结束指向新结点*/
else
{
newnode->next=ptr->next; /*新结点指向下一个结点*/
ptr->next=newnode; /*结点ptr指向新结点*/
}
}
return head;
}
/************************单链表的删除**************************/
LinkNode *DeleteNode(LinkNode *head,LinkNode *ptr)/*链表结点删除*/
{
LinkNode *pre; /*指向前一结点*/
if(ptr==head) /*是否是链表的开始*/
return head->next; /*输出第二个结点*/
else
{
pre=head;
while(pre->next !=ptr) /*找结点ptr的前结点*/
pre=pre->next;
if(ptr->next ==NULL) /*是否是链表的结束*/
pre->next = NULL; /*最后一个结点*/
else
pre->next = ptr->next ; /*中间结点*/
}
free(ptr); /*释放结点内存*/
return head;
}
/***********************单链表输出***************************/
void PrintNode(LinkNode *ptr) /*链表输出*/
{
while(ptr!=NULL) /*链表遍历循环*/
{
printf("%d\t",ptr->data ); /*输出结点数据*/
ptr=ptr->next; /*指向下一结点*/
}
printf("\n");
}
/*************************单链表内存释放*************************/
void FreeLinkNode(LinkNode *head) /*链表的内存释放*/
{
LinkNode *ptr;
while(head!=NULL)
{
ptr=head;
head=head->next ;
free(ptr);
}
}
/*************************主函数*************************/
int main()
{
int num,value;
LinkNode *head,*ptr; /*指向链表开始*/
head = CreatLinkNode(); /*创建链表*/
PrintNode(head); /*输出链表*/
printf("请输入要查找的数据:\n");
scanf("%d",&num);
ptr=FindNode(head,num); /*查询数据*/
if(!ptr)
printf("没有找到\n"); /*没有查询到*/
else
{
printf("找到啦!\n请输入要插入的数据:\n");
scanf("%d",&value);
head=InsertNode(head,ptr,value); /*插入数据*/
PrintNode(head); /*输出链表*/
}
printf("请输入要查找并删除的数据:\n");
scanf("%d",&num);
ptr=FindNode(head,num);
if(!ptr)
printf("没有找到\n");
else
{
printf("找到啦!\n");
head=DeleteNode(head,ptr);
PrintNode(head);
}
FreeLinkNode(head); /*释放链表*/
return 0;
}
数据结构学起来 好久远的事情,大学的内容哦 hnyzcj 发表于 2016-5-22 17:04
好久远的事情,大学的内容哦
哈哈,我还年轻~~ 凌风清羽 发表于 2016-5-22 17:06
哈哈,我还年轻~~
{:5_172:} 学习学习
页:
[1]