各种基本算法实现小结(一)—— 单链表
(均已测试通过)
============================================================
单链表(测试通过)
测试环境: Win-TC
#include <stdio.h> struct _node { int data; struct _node *next; }; typedef struct _node list; void display(list *l) { list *p; p=l; while(p->next) { printf("%5d", p->next->data); p=p->next; } } void main() { int i, n; list *h, *p, *s; printf("Enter num n:"); scanf("%d", &n); h=(list*)malloc(sizeof(list)); h->data=-1; h->next=NULL; s=p=h; for(i=n;i>0;i--) { p=(list*)malloc(sizeof(list)); scanf("%d", &(p->data)); p->next=h->next; h->next=p; h=h->next; } display(s); getch(); }
运行结果:
=================================================
单链表各种操作(测试通过)
测试环境: Win-TC
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct _node
{
int data;
struct _node *next;
};
typedef struct _node node, *plist;
plist init_list()
{
plist pl;
pl=(plist)malloc(sizeof(node));
if(NULL==pl)
{
printf("init list, malloc is fail.../n");
return NULL;
}
pl->data=-1;
pl->next=NULL;
return pl;
}
int isempty_list(plist pl)
{
if(NULL==pl || NULL!=pl->next)
return 1;
else
return 0;
}
plist clear_list(plist pl)
{
pl=NULL;
return pl;
}
void destroy_list(plist pl)
{
plist p, s;
p=pl->next;
while(p)
{
s=p;
p=p->next;
free(s);
}
pl=NULL;
}
void insert_item(plist pl, int i, int e)
{
int j=1;
plist p, s;
p=pl;
while(p && j<i)
{
p=p->next;
j++;
}
if(!p || j>i) /* >len or <1 */
printf("Insert fail.../n");
s=(plist)malloc(sizeof(node));
s->data=e;
s->next=p->next;
p->next=s;
}
void display(plist pl)
{
plist p;
p=pl->next;
while(pl && p)
{
printf("%5d", p->data);
p=p->next;
}
printf("/n/n");
}
int getbyid_item(plist pl, int i)
{
plist p=pl->next;
int j=1;
while(p && j<i)
{
p=p->next;
j++;
}
if(!p || j>i) /* >len or <1 */
{
printf("fail.../n");
exit(1);
}
return p->data;
}
int locate_item(plist pl, int e)
{
plist p=pl->next;
int j=1;
while(p->data != e && p->next)
{
p=p->next;
j++;
}
if(p->data == e)
return j;
else
{
printf("There is n %d in list/n", e);
return -1;
}
}
void delete_item(plist pl, int i, int *e)
{
plist p=pl;
plist q;
int j=1;
while(p->next && j<i)
{
p=p->next;
j++;
}
if(!p->next || j>i) /* >len or <1 */
{
printf("fail..../n");
return;
}
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
}
int len_list(plist pl)
{
int j=0;
plist p=pl;
while(pl && p->next)
{
j++;
p=p->next;
}
return j;
}
plist traverse_list(plist pl)
{
plist h, p, s;
if(!pl || !pl->next)
return pl;
h=pl->next;
s=h;
p=s->next;
h->next=NULL;
while(p)
{
s=p;
p=p->next;
s->next=h;
h=s;
}
pl->next=h;
return pl;
}
void main()
{
int len, pos, *del;
plist pl=NULL;
del=(int *)malloc(sizeof(int));
pl=init_list();
isempty_list(pl);
insert_item(pl, 1, 1);
insert_item(pl, 2, 3);
insert_item(pl, 3, 5);
insert_item(pl, 4, 7);
insert_item(pl, 5, 9);
insert_item(pl, 6, 11);
display(pl);
len=len_list(pl);
printf("link list len: %d/n", len);
pos=locate_item(pl, 7);
printf("num 7 pos: %d/n", pos);
delete_item(pl, 3, del);
printf("delete pos 3 num: %d/n", *del);
display(pl);
printf("link list traverse.../n");
pl=traverse_list(pl);
display(pl);
destroy_list(pl);
getch();
}
运行结果:
=================================================
单向循环链表(测试通过)
测试环境: Win-TC
#include <stdio.h> #include <malloc.h> struct _node { int data; struct _node *next; }; typedef struct _node node, *plist; plist init_list() { plist pl=(plist)malloc(sizeof(node)); if(!pl) { printf("error malloc fail.../n"); return NULL; } pl->data=-1; pl->next=pl; /* pl->next=NULL */ return pl; } void insert_item(plist pl, int pos, int data) { int j=0; plist p,s; s=p=pl; while(p && j<pos-1) { p=p->next; j++; } if(!p || j>pos-1) { printf("Error insert fail.../n"); return; } s=(plist)malloc(sizeof(node)); if(!s) { printf("Error malloc fail.../n"); return; } s->data=data; s->next=p->next; p->next=s; } int find_item(plist pl, int data) { plist s,p; s=p=pl; p=p->next; while(s != p) { if(data==p->data) return 1; p=p->next; } return 0; } void delete_item(plist pl, int data) { plist p,s; s=p=pl; if(data == p->data) /* first item is equal with data, then last item = second item */ { s=p; while(s != p->next) p=p->next; p->next=s->next; return; } while(s != p->next) /* first item is not equal with data */ { if(data == p->next->data) { p->next=p->next->next; return; } p=p->next; } } void display(plist pl) { plist s,p; s=p=pl; printf("%5d", p->data); /* print first item */ p=p->next; while(s != p) { printf("%5d", p->data); p=p->next; } printf("/n/n"); } void main() { int f; plist pl; pl=init_list(); insert_item(pl, 1, 1); insert_item(pl, 2, 3); insert_item(pl, 3, 5); insert_item(pl, 4, 7); insert_item(pl, 5, 9); display(pl); printf("Finding 3.../n"); f=find_item(pl, 3); if(f) printf("True find 3/n"); else printf("False find 3.../n"); printf("/nDeleting 1.../n"); delete_item(pl->next, 1); display(pl->next); getch(); }
运行结果:

双向循环链表(测试通过)
测试环境: Win-TC
