单链表
--------------------------------------------------------------------------------
/* 程序开头的预处理命令和结构体定义:*/
#include <stdio.h>
#include <stdlib.h>
#define error(x) fprintf(stderr,x)
typedef struct node{
int data;
struct node *next;
}NODE;
/* 建立单链表的函数:*/
/* 说明:本程序有头结点,数组中的数据从下标1开始存放 */
NODE *createlist(int A[],int n)
{
NODE *h,*p,*q;
int i;
if(n<=0) return (NULL);
q=(NODE*)malloc(sizeof(NODE));
h=q;
for(i=1;i<=n;i++)
{
p=(NODE*)malloc(sizeof(NODE));
p->data=A[i];
q->next=p;
q=p;
}
q->next=NULL;
return (h);
}
/* 在第i个元素之前插入一个新的元素:*/
void insert1(NODE *p,int i,int key)
{
int j=0;
NODE *t;
while(p!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(p==NULL) error("下标越界!");
else
{
t=(NODE*)malloc(sizeof(NODE));
if(t==NULL) error("没有足够的存储空间");
else
{
t->data=key;
t->next=p->next;
p->next=t;
}
}
}
/* 在值为key的元素之前插入一个新的元素(假设该线性表中没有相同的元素):*/
void insert2(NODE *h,int key,int key1)
{
int j=0;
NODE *p=h,*temp;
while(p->next!=NULL && p->next->data!=key)
{
p=p->next;
}
if(p->next->data==key)
{
temp=(NODE*)malloc(sizeof(NODE));
if(temp==NULL) error("没有足够的存储空间");
else
{
temp->data=key1;
temp->next=p->next;
p->next=temp;
}
}
}
/* 在升序排列的线性表中插入一个新的元素,插入后仍然保持有序:*/
void insert_node(NODE *h, int key)
{
NODE *q, *p, *s;
s=(NODE *)malloc(sizeof(NODE)) ;
s->data = key;
q = h;
p = h->next;
while( p!=NULL && s->data > p->data )
{ q = p;
p = p->next;
}
q->next = s;
s->next = p;
}
/* 删除线性表第i个元素:*/
void delete1(NODE *h,int i)
{
int j=0;
NODE *p,*q;
p=h;
while(p->next!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(p->next==NULL) error("下标越界!");
else
{
q=p->next;
p->next=q->next;
free(q);
}
}
/* 删除单链表中值为key的元素(假设该线性表中没有相同的元素):*/
void delete2(NODE *h,int key)
{
NODE *q,*p=h;
while(p!=NULL && p->data!=key)
{
q=p;
p=p->next;
}
if(p->data==key)
{
q->next=p->next;
free(p);
}
}
/* 显示输出单链表全部元素的函数:*/
void printlist(NODE *h)
{
NODE *p=h->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("/n/n");
}
/* 上机练习时,可编写程序调用以上函数。例如:*/
void main()
{
int A[]={0,10,20,30,40,50},n=5; /* 数据从下标1开始存放 */
NODE *h;
h=createlist(A,n);
/* 显示输出线性表的每一个元素,验证建立单向表的函数是否正确 */
printlist(h);
/* 删除第4个元素,然后输出验证 */
delete1(h,4);
printf("删除第4个元素: "); printlist(h);
/* 删除值为30的元素,然后输出验证 */
delete2(h,30);
printf("删除值为30的元素: "); printlist(h);
/* 在第2个元素前插入一个元素15,然后输出验证 */
insert1(h,2,15);
printf("在第2个元素前插入元素15: "); printlist(h);
/* 在值为50的元素前插入一个元素45,然后输出验证 */
insert2(h,50,45);
printf("在值为50的元素前插入元素45: "); printlist(h);
/* 在线性表中插入一个元素22,要保持有序,然后输出验证 */
insert_node(h,22);
printf("插入一个元素22,要保持有序: "); printlist(h);
}
--------------------------------------------------------------------------------