单链表:
详细就不写了,可以看下面这篇文章,特别详细!
相关资源:
链表--单链表的创建与查找 点击打开链接
定义:
typedef struct Node{ElemType data;
struct Node* next;
}Node, *LinkList;
自己实践才知道,太容易出错了,动不动就报错!以后一定要实践实践,细心细心!
以下为代码的粗糙实现,写得不好,见谅!(其中ClearList有点问题)
/*
* =====================================================================================
*
* Filename: single_linklist.c
*
* Description: It's my first single linklist action.
*
* Version: 1.0
* Created: 03/31/2014 11:39:50 AM
* Revision: none
* Compiler: gcc
*
* Author: nick-yang (ny), ywok526@126.com
* Organization: 123
*
* =====================================================================================
*/
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node* next;
}Node, *LinkList;
LinkList InitList(LinkList list)
{
list = (Node*)malloc(sizeof(Node*));
list->next = NULL;
printf("Init list.\n");
return list;
}
/*use head insert ro intialize a list*/
LinkList CreateList(LinkList list, int n)
{
LinkList p;
int i;
srand(time(0));
list = (Node*)malloc(sizeof(Node*));
list->next = NULL;
for(i=1;i<=n;++i)
{
p = (Node*)malloc(sizeof(Node*));
p->data = rand()%n + 1;
p->next = list->next;
list->next = p;
printf("%d ",p->data);
}
printf("\n");
printf("fill data from head into list.\n");
return list;
}
/*insert a element into list at location n,
return 1 when it is done or 0 when it errors. */
int ListInsert(LinkList list,int n,ElemType e)
{
LinkList p,l;
int i=1;
p = list->next;
if(n<1)
return 0;
while(p&&(i<n))
{
p = p->next;
i++;
}
if(!p)
return 0;
l = (Node*)malloc(sizeof(Node*));
l->next = p->next;
p->next = l;
l->data = e;
return 1;
}
int ListDelete(LinkList list,int n)
{
LinkList p;
int i=1;
p = list->next;
if(n<1)
return 0;
while(p&&(i<n))
{
p = p->next;
i++;
}
if(!p)
return 0;
p->next = p->next->next;
return 1;
}
int GetElem(LinkList list,int n,ElemType *e)
{
LinkList p;
int i=1;
p = list->next;
if(n<1)
return 0;
while(p&&(i<n))
{
p = p->next;
i++;
}
if(!p)
return 0;
*e = p->data;
return 1;
}
/*the length of list*/
int GetLength(LinkList list)
{
LinkList p;
int len=0;
p = list->next;
while(p)
{
p = p->next;
len++;
}
return len;
}
/*detect list is empty,
return 1 when it is empty or 0 when it is not empty. */
int ListEmpty(LinkList list)
{
LinkList p;
p = list->next;
if(p)
{
printf("list is not empty.\n");
return 0;
}
else
{
printf("list is empty.\n");
return 1;
}
}
int ElemLocation(LinkList list,ElemType e)
{
LinkList p;
int pos=1;
p = list->next;
while(p)
{
if (e == p->data)
{
break;
}
p = p->next;
pos++;
}
if(p)
return pos;
else
return 0;
}
/*clear List*/
void ClearList(LinkList list) //ERROR
{
LinkList p;
if (list == NULL)
{
printf("the list is already empty.\n");
}
while(list->next)
{
p = list->next;
free(list);
list = p;
}
printf("clear list\n");
}
void ListDisplay(LinkList list)
{
printf("The data in list is: \n");
list = list->next;
while(list)
{
printf(" %d,",list->data);
list=list->next;
}
printf("\n");
}
int main()
{
LinkList mylist = InitList(mylist);
ListEmpty(mylist);
printf("---------------\n");
mylist = CreateList(mylist, 20);
ListEmpty(mylist);
ListDisplay(mylist);
printf("the length of list is %d\n",GetLength(mylist));
printf("---------------\n");
ElemType los = ElemLocation(mylist,10);
printf("the location of %d is: %d\n.",10 , los);
printf("---------------\n");
ElemType abc;
int ret = GetElem(mylist, 5,&abc);
if(ret)
printf("%d\n",abc);
else
printf("get element error.\n");
printf("---------------\n");
ret = ListInsert(mylist, 5, 50);
if(ret)
printf("insert OK\n",abc);
else
printf("insert element error.\n");
ListDisplay(mylist);
printf("the length of list is %d\n",GetLength(mylist));
printf("---------------\n");
ret = ListDelete(mylist, 5);
if(ret)
printf("delete OK\n",abc);
else
printf("delete element error.\n");
ListDisplay(mylist);
printf("the length of list is %d\n",GetLength(mylist));
printf("---------------\n");
return 0;
}