凌风清羽 发表于 2016-5-22 16:54:48

单链表的创建以及操作

/*************************单链表的创建以及使用**********************************/
#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;
}


凌风清羽 发表于 2016-5-22 16:55:14

数据结构学起来

hnyzcj 发表于 2016-5-22 17:04:33

好久远的事情,大学的内容哦

凌风清羽 发表于 2016-5-22 17:06:48

hnyzcj 发表于 2016-5-22 17:04
好久远的事情,大学的内容哦

哈哈,我还年轻~~

凌风清羽 发表于 2016-5-22 17:06:58

凌风清羽 发表于 2016-5-22 17:06
哈哈,我还年轻~~

{:5_172:}

dsweiliang 发表于 2016-6-3 09:34:39

学习学习
页: [1]
查看完整版本: 单链表的创建以及操作