您的位置:首页 > 编程语言 > C语言/C++

C语言实现单链表

2017-03-15 11:11 197 查看
Dev C++编译运行通过,实现了单链表的构建,清空,插入,删除和查询。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
#include<windows.h>
#define OK 1
#define ERROR 0

typedef int ElemType;

typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList;

typedef int Status;

Status GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList p=NULL;
p=L->next;
j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;

*e=p->data;
//printf("%d\n",p->data);
return OK;
}

Status ListInsert(LinkList *L,int i,ElemType e)
{
int j;
LinkList p,s;
p=*L;
j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
s=(LinkList)malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}

Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j;
LinkList p,q;
p=*L;
j=1;
while(p->next&&j<i)
{
p=p->next;
++j;
}
if(!(p->next)||j>i)
return ERROR;
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
return OK;
}

void CreateListTail(LinkList *L,int n)
{
LinkList p,r;
int i;
srand(time(NULL));
*L=(LinkList)malloc(sizeof(Node));
r=*L;
for(i=0;i<n;i++)
{
p=(Node*)malloc(sizeof(Node));
p->data=rand()%100+1;
r->next=p;
r=p;
}
r->next=NULL;
}

Status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;
return OK;
}

int main()
{
int num=5;
int i;
int aa=2;
int bb=0;
LinkList ll,pp;
CreateListTail(&ll,num);

pp=ll->next;
for(i=0;i<num;i++)
{
printf("%d,",pp->data);
pp=pp->next;
printf("\n");
}

GetElem(ll,aa,&bb);
printf("获取的元素是%d\n",bb);

int cc=99;
ListInsert(&ll,aa,cc);
GetElem(ll,aa,&bb);
printf("插入的元素是%d\n",bb);

ListDelete(&ll,aa,&bb);
printf("删除的元素是%d\n",bb);

ClearList(&ll);

return 0;
}


在最初运行时遇到一个小问题,就是打印显示出来的链表里的数据都是一样的,而且获取除了第一个元素外,获取其他的元素都不对。开始先排除实现的那些函数都没问题,然后再排除初始化产生随机数的时候能正确产生不同的数字,那么就是在主函数里有问题。最后终于发现是主函数里for循环有问题,竟然把一个变量的初始化放入到循环里,这不意味着每次循环变量都被赋予初始值,那在循环里还改变个什么劲啊!!!感觉自己蠢蠢哒。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: