单链表的C语言实现

今天学习了单链表,并写出了其的C语言实现,验证了一下感觉基本正确。但是代码的健壮性不够,对于有的不合法的输入,并没有显示输出错误。

代码可以直接贴在编译器上编译执行,我已经写过主函数了。

如有错误,欢迎指正。

#include <stdio.h>
#include <malloc.h> 
typedef struct LNode
{
        int data;
        LNode *next;
}LNode, *LinkList;

LinkList create()    /建立链表
{
         LNode *head;
         head = (LinkList)malloc(sizeof(LNode));    为什么要用linklist而不能用LNode 这是malloc函数的规定 
         int i;
         printf("how many numbers do you want to scanf:"); 
         scanf("%d", &i); 
         LinkList p;
         p = head;
         while (i)
         {
               int a;
               scanf("%d", &a);
               LinkList temp;
               temp = (LNode*)malloc(sizeof(LNode)); 
               temp->data = a;
               p->next = temp ; 
               p = temp; 
               i--; 
         } 
         p->next = NULL; 
         return head; 
} 
int ListInsert(LinkList p, int i, int &e)      链表指定位置插入元素
{
    LinkList p1, p2, temp; 
    p1 = p; 
    while (i - 1)
    {
         p1 = p1 ->next;
         i--; 
    } 
    p2 = p1 -> next;
    temp = (LinkList)malloc(sizeof(LNode)) ; 
    temp -> data = e;
    p1 ->next = temp;
    temp -> next = p2; 
    return 0; 
} 

int ListDelete(LinkList p, int i, int &e)           链表指定位置删除函数,并用e返回删除值。
{
    LinkList p1, p2; 
    p1 = p; 
    while (i - 1)
    {
         p1 = p1 ->next;
         i--; 
    } 
    p2 = p1 -> next;
    e = p2 -> data;
    p1 -> next = p2 -> next;  
    free(p2); 
    return 0; 
    
} 
int Length(LinkList p)                                 链表长度
{
    LinkList q;
    q = p;
    int i = 0;  
    while(q->next)
    {
                  q = q->next;
                  i++; 
    } 
    return i; 
} 
int ListSort(LinkList p)                                         //链表内元素排序
{
    int i;
    LNode *q1, *q2;
    
    i =  Length(p); 
    int j;
    
    for (j = 0; j < i; j++)
    {
        q1 = p;
        q1 = q1 -> next;
        q2 = q1 -> next; 
        int k;
        for (k = 0; k < i - j - 1; k++)
        {
            if (q1 -> data > q2 -> data) 
            {
                   int temp;
                   temp = q1 -> data;
                   q1 -> data = q2 -> data;
                   q2 -> data = temp; 
            } 
            q1 = q1 -> next;
            q2 = q2 -> next; 
        } 
    } 
    return 0; 
} 
int ListSee(LinkList p)                                               //链表的遍历
{
    int i;
    i = Length(p);
    p = p -> next;  
    while(i --)
    {
            printf("%d ", p -> data); 
            p = p -> next; 
    } 
    printf("\n");
    return 0; 
} 
LinkList reserve(LinkList p)
{
         LinkList q1, q2, q3,rehead; 
         q1 = p -> next;
         q2 = q1 -> next;
         q3 = q2 -> next;
         q1 -> next = NULL; 
         while(q3)
         {
                q2 -> next = q1; 
                q1 = q2;
                q2 = q3;
                
                q3 = q3 -> next; 
         }
         q2 -> next = q1; 
         p = (LinkList)malloc(sizeof (LNode)) ;
         p -> next =  q2; 
         return p; 
        
} 
int main()                                           //主函数验证了下实现效果如何。
{
    LNode *head;
    int i, j;
    i = 2;
    head = create(); 
    ListSee(head);
   /* head = reserve(head); 
    ListSee(head); */ 
    ListSort (head); 
    ListSee(head); 
    ListDelete(head,i,  j);
    printf("%d\n", j);
    ListSee(head);
    ListInsert(head,i, j);
    ListSee(head);
    system ("pause");
    return 0; 
} 

 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值