您的位置:首页 > 理论基础 > 数据结构算法

新手学习数据结构与算法---单链表的基本操作

2011-10-16 12:06 357 查看
单链表操作。。。

大家指点一下。


//单链表及其基本操作
//这里的链表都是带头结点的-------------
#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()
{
//自己定义测试
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: