C语言代码对初学者来说是一个比较揪心的东西,尤其是结构体和传值传地址的用法。这里我给出了一个简单的单链表的代码,希望大家看一下,尤其注意一下传入子函数的参数形式。
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}*LinkList;
Status GetElem(LinkList L,int i,ElemType e)
{
int j=0;
LinkList p=L;
while(j
{
j++;
p=p->next;
}
if(p==NULL)
return FALSE;
else{e = p->data; return e;}
}
Status LocateElem(LinkList L, ElemType e)
{
int i = 1;
LinkList p=L->next;
while(p!=NULL && p->data!=e)
{
p=p->next;
i++;
}
if(p==NULL)
return FALSE;
else
return (i);
}
Status ListInsert(LinkList *L, int i, ElemType e)
{
int j=0;
LinkList p=*L,s;
while(j
{j++;p=p->next;}
if(p==NULL)
return FALSE;
else
{
s=(LinkList)malloc(sizeof(LinkList));
s->data=e;
s->next=p->next;
p->next=s;
return TRUE;
}
}
Status ListDelete(LinkList *L, int i, ElemType e)
{
int j=0;
LinkList p=*L,q;
while(j
{
j++;
p=p->next;
}
if(p==NULL)
return FALSE;
else
{
q=p->next;
if(q==NULL)
return FALSE;
e=q->data;
p->next=q->next;
free(q);
return e;
}
}
Status visit(ElemType c)
{
printf("%d ",c);
return OK;
}
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node));
if(!(*L))
{
return ERROR;
}
(*L)->next=NULL;
return OK;
}
int ListLength(LinkList L)
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
Status ListTraverse(LinkList L)
{
LinkList p=L->next;
while(p)
{
visit(p->data);
p = p->next;
}
printf("\n");
return OK;
}
void CreateListTail(LinkList *L, int n)
{
LinkList p,r;
int i;
srand(time(0));
*L = (LinkList)malloc(sizeof(Node));
r=*L;
for (i=0; i < n; i++)
{
p = (Node *)malloc(sizeof(Node));
p->data = rand()0+1;
r->next=p;
r = p;
}
r->next = NULL;
// 创建有环链表
//r->next = p;
}
Status GetMidNode(LinkList L, ElemType *e)
{
LinkList search, mid;
mid = search = L;
while (search->next != NULL)
{
//search移动的速度是 mid 的2倍
if (search->next->next != NULL)
{
search = search->next->next;
mid = mid->next;
}
else
{
search = search->next;
}
}
*e = mid->data;
return OK;
}
int main()
{
LinkList L;
Status i;
char opp;
ElemType e;
Status find;
Status tmp;
i=InitList(&L);
printf("初始化L后:ListLength(L)=%d\n",ListLength(L));
printf("\n1.查看链表 \n2.创建链表(尾插法) \n3.链表长度 \n4.中间结点值 \n5.第i个位置的元素值 \n6.确定元素的位置\n7.添加元素噢!\n8.删除元素噢!\n0.退出 \n请选择你的操作:\n");
while(opp != '0')
{
scanf("%c",&opp);
switch(opp)
{
case '1':
ListTraverse(L);
printf("\n");
break;
case '2':
CreateListTail(&L,20);
printf("整体创建L的元素(尾插法):\n");
ListTraverse(L);
printf("\n");
break;
case '3':
//clearList(pHead); //清空链表
printf("ListLength(L)=%d \n",ListLength(L));
printf("\n");
break;
case '4':
//GetNthNodeFromBack(L,find,&e);
GetMidNode(L, &e);
printf("链表中间结点的值为:%d\n", e);
//ListTraverse(L);
printf("\n");
break;
case '5':
printf("你想看哪个位置的元素?\n");
scanf("%d", &i);
e=GetElem(L,i,e);
printf("第%d个数是%d",i,e);
printf("\n");
break;
case '6':
printf("请输入你要确定位置的元素:\n");
scanf("%d", &e);
find=LocateElem(L,e);
printf("该值的位置为%d\n", find);
break;
case '7':
printf("请输入你要添加的元素:\n");
scanf("%d",&e);
printf("请输入你要插入的位置:\n");
scanf("%d", &i);
tmp=ListInsert(&L,i,e);
if(tmp=1)printf("成功!");
else printf("失败!");
ListTraverse(L);
break;
case '8':
printf("请输入你要释放的元素的位置:\n");
scanf("%d", &i);
tmp=ListDelete(&L,i,e);
printf("元素%d已经被删除\n",tmp);
ListTraverse(L);
break;
case '0':
exit(0);
}
}
return 0;
}