创建单链表,首先要建立一个结构体,如下:
#include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct Lnode{ ElemType data; struct Lnode *next; }Lnode,*LinkList;
创建链表,这里使用的是尾插法建立链表,它主要是在表尾不断地添加新元素,直到输入-1,然后退出。
LinkList CreatList()//创建列表 { ElemType x; LinkList head,p,tail; head=(LinkList)malloc(sizeof(Lnode)); head->next=NULL; tail=head; scanf("%d",&x); while(x!=-1){ p=(LinkList)malloc(sizeof(Lnode)); p->data=x; p->next=NULL; tail->next=p; tail=p; scanf("%d",&x); } return head; }
计算表长,运用遍历,将链表的长度利用一个变量存储,然后有指针存储。
int LongList(LinkList head,int* length)//计算表长 第一个元素列表 第二个存储表长 { LinkList p; p=(LinkList)malloc(sizeof(Lnode)); p=head->next; if(p==NULL){ return 0; } int i=1; while(p){ p=p->next; i++; } *length=i-1;//因为每次先查询后面的元素,所以i也把最后一个NULL加了进去,所以要减一 return 1; }
插入元素,单链表插入元素,需要知道该位置的链表元素,然后先将插入元素的尾部连接到链表内,再将该节点的头部接入。
int insert(LinkList head,int i,ElemType x)//插入 1链表 2插入位置 3插入元素 { LinkList p,s; p=(LinkList)malloc(sizeof(Lnode)); p=head->next; int j=1; while(p&&j!=i-1){ p=p->next; j++; } if(p==NULL||j!=i-1){ return 0; } s=(LinkList)malloc(sizeof(Lnode)); s->data=x; s->next=p->next; p->next=s; return 1; }
删除元素,需要知道该元素前面位置的链表节点,然后进行删除,并返回删除元素,同时也要将该节点内存释放。
int DelList(LinkList head,int i,ElemType *n)//删除元素 1链表 2删除位置 3记录删除元素 { LinkList p,s; p=(LinkList)malloc(sizeof(Lnode)); p=head->next; s=(LinkList)malloc(sizeof(Lnode)); int j=1; while(j!=i-1&&p){ p=p->next; j++; } if(j!=i-1||p->next==NULL){ return 0; } s=p->next; p->next=s->next; *n=s->data; free(s); return 1; }
查询元素,利用遍历列表,找到要查找位置的元素,并返回。
int search(LinkList head,int i,ElemType *n)//查找元素 1链表 2查找元素的位置 3该位置上的元素是什么 { LinkList p; p=(LinkList)malloc(sizeof(Lnode)); p=head->next; int j=1; while(j!=i&&p){ p=p->next; j++; } if(p==NULL||j!=i){ return 0; } *n=p->data; return 1; }
输出单链表所有元素。
void print(LinkList head)//输出 { LinkList p; p=head->next; while(p){ printf("%d ",p->data); p=p->next; } }
在该链表的创建和基本操作中,我都返回了0或1,其作用是测试单链表的操作是否符合规则,操作成功,返回1,失败,返回0。