单链表操作。。。
大家指点一下。
//单链表及其基本操作
//这里的链表都是带头结点的-------------
#include <stdio.h>
#include <malloc.h> //用来进行动态内存分配
#include <stdlib.h>
typedef struct Node
{
char data; //数据域
struct Node * next; //指针域
}LinkList; //不要忘记这个;
LinkList * SetNull(LinkList * L) //置空表操作
{
L->next = NULL; //只要将第一个节点的指针域设置为NULL即可
return L;
}
int Length(LinkList * L) //求表长操作(带头结点),求的时候头结点不算
{
LinkList * p;
int n = 0;
p = L->next; //从头结点后面的首元素节点开始计数
while(p != NULL) //循环计数
{
p = p->next;
n++;
}
return n;
}
LinkList * NumberGet(LinkList * L, int i) //从带头结点的链表中找到第i个结点(头结点不算)
{
int j = 1;
LinkList * p;
p = L->next;
while(p != NULL && (j < i)) //用j主要是防止i可能有:i<=0,i>n
{
p = p->next;
j++;
}
if(i == j)
return p;
else
return NULL; //若未找到则返回NULL
}
LinkList * ValueGet(LinkList * L, char c) //按值查找某个结点
{
LinkList * p;
p = L->next;
while(p != NULL)
{
if(c == p->data) //把c写在前面是防止写成=,方便报错
break; //若找到则直接跳出
else
p = p->next;
}
return p;
}
void Insert(LinkList * L, int i, char c) //链表的插入操作,在第i个位置插入值c(头结点不算)
{
int j = 1;
LinkList * p, * S;
p = L; //为什么这个不是p = L->next??? ,后面说明
while(p != NULL && (j < i)) //在j为i这个位置插入
{
p = p->next;
j++;
}
if(p == NULL) //检测一下p是否为NULL
printf("序号超过范围\n");
else
{
S = (LinkList *)malloc(sizeof(LinkList));
S->data = c;
S->next = p->next; //就是这个原因,这时p正好是i前面的那个结点
} p->next = S;
}
void Delete(LinkList * L, int i)
{
int j = 1;
LinkList * p, *T;
p = L; //不用p = L->next 原因同上
while(p != NULL && (j < i))
{
p = p->next;
j++;
}
if(p != NULL && (p->next != NULL)) //确定第i个跟第i-1个都不是NULL
{
T = p->next;
p->next = T->next;
free(T); //释放这个结点
}
}
LinkList * CreatList() //建立单链表
{
char c;
LinkList * head, * L, * S;
L = (LinkList *)malloc(sizeof(LinkList));
head = L;
L->next = NULL; //先建一个空链表
while(c != '#')
{
S = (LinkList *)malloc(sizeof(LinkList));
S->data = c;
S->next = L->next; //让S->next变为NULL
L->next = S;
c = getchar();
}
return head;
}
void PrintList(LinkList * p)
{
p = p->next; //头结点不打印
while(p != NULL)
{
printf("%4c", p->data);
p = p->next;
}
}
int main()
{
//自己定义测试
}