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