线性表的链式存储实现。
#include <stdio.h>
#include <stdlib.h>
typedef int datatype; /*datatype可为任意类型,这里假设为int*/
typedef struct node
{
datatype data;
struct node *next;
}Linklist;
/*尾插法建立带头节点的单链表*/
Linklist *CreateList()
{
char ch;
Linklist *head,*s,*r;
head = (Linklist*)malloc(sizeof(Linklist)); /*生成头节点*/
r = head; /*尾指针初值指向头节点*/
ch = getchar();
while(ch != '$') /**/
{
s = (Linklist*)malloc(sizeof(Linklist));
s->data = ch;
r->next = s; /*非空表,新节点*s插入到尾节点*r之后*/
r = s; /*尾指针r指向新的表尾*/
ch = getchar();
}
r->next = NULL;
return head; /*返回单链表头指针*/
}
/*查找运算,按序号查找,在带头节点的单链表head中查找第i个节点,若找到则返回该节点的存储位置*/
Linklist *Get_Innum(Linklist *head,int i)
{
int j = 0;
Linklist *p;
p = head;
while (p->next != NULL && j < i)
{
p = p ->next;
j ++;
}
if (i == j)
{
return p;
}
else
{
return NULL;
}
}
/*按值查找,在带头节点的单链表head中查找其节点值等于key的节点*/
Linklist *Loacate_Key(Linklist *head,datatype key)
{
Linklist *p;
p = head->next; /*从开始节点比较*/
while (p != NULL)
{
if (p->data != key)
{
p = p->next;
}
else
{
break;
}
}
return p;
}
/*插入运算,后插操作。将值为x的新节点插入*p之后*/
void Insert_After(Linklist *p,datatype x)
{
Linklist *s;
s = (Linklist *)malloc(sizeof(Linklist));
s->data = x;
s->next = p->next;
p->next = s;
}
/*在单链表上实现线性表的插入运算,该运算生成一个值为x的新节点,并插入到链表中第i个节点之前*/
void Insert(Linklist *L,datatype x,int i)
{
Linklist *p;
int j;
j = i - 1;
p = Get_Innum(L,j);
if (p == NULL )
{
printf("Error\n");
}
else
{
Insert_After(p,x);
}
}
/*删除运算*/
void Delete_After(Linklist *p)
{
Linklist *r;
r = p->next;
p->next = r->next;
free(r);
}
void Delete(Linklist *L,int i)
{
Linklist *p;
int j = i -1;
p = Get_Innum(L,j);
if (p != NULL && p->next != NULL)
{
Delete_After(p);
}
else
{
printf("Error\n");
}
}