单链表的C语言实现

来源:互联网 发布:熊片数据库 安卓 编辑:程序博客网 时间:2024/05/17 15:56

今天学习了单链表,并写出了其的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; }  


原创粉丝点击