链表的基本操作
定义结构体
typedef struct Node
{
int num;
struct Node *next;
}Node,*linklist;
1.链表的初始化
linklist lnitlist()
{
linklist head;
head=(Node*)malloc(sizeof(Node));
head->next=NULL;
return head;
}
2.创建链表
(1)头插法
void creatbyhead(linklist head)
{
Node *q;
int number;
while(1)
{
scanf("%d",&number);
if(number==0)
break;
q=(Node*)malloc(sizeof(Node));
q->num=number;
q->next=head->next;
head->next=q;
}
}
(2)尾插法
void creatbyrear(linklist head)
{
Node *r,*s;
int number;
r=head;
while(1)
{
scanf("%d",&number);
if(number==0)
break;
s=(Node*)malloc(sizeof(Node));
s->num=number;
r->next=s;
r=s;
}
r->next=NULL;
}
3.输出链表
void output(linklist head)
{
Node *p;
p=head->next;
while(p)
{
printf("%d",p->num);
p=p->next;
}
}
4.删除
void delet (linklist head,int n)
{
Node *p,*q;
int i=0;
p=head;
while(p&&(i<n-1))
{
p=p->next;
i++;
}
if(p->next)
{
q=p->next;
p->next=q->next;
free(q);
}
}
5.按序号查找
int get(linklist head,int n)
{
Node *p;
int i=0,x;
p=head;
while(p&&(i<n))
{
p=p->next;
i++;
}
x=p->num;
return x;
}
6.有序链表的插入
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read();
void Print( List L );
List Insert( List L, ElementType X );
int main()
{
List L;
ElementType X;
L = Read();
scanf("%d", &X);
L = Insert(L, X);
Print(L);
return 0;
}
实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。
L
是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Insert
要将X
插入L
,并保持该序列的有序性,返回插入后的链表头指针。
List Insert( List L, ElementType X ){
List head=L,p=L,y=L;
List q=(List)malloc(sizeof(List));
q->Data=X;
q->Next=NULL;
p=p->Next;
if(p==NULL){
head->Next=q;
return head;
}
while(p->Data<X){
y=L;
p=p->Next;
if(p==NULL) break;
}
y->Next=q;
q->Next=p;
return head;
}
7.
两个有序链表序列的合并
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read();
void Print( List L );
List Merge( List L1, List L2 );
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}
L1
和L2
是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge
要将L1
和L2
合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。
List Merge( List L1, List L2 )
{
List p,pa,pb,L;
pa=L1->Next;
pb=L2->Next;
L=(List*)malloc(sizeof(List));
p=L;
while(pa&&pb)
{
if(pa->Data>pb->Data)
{p->Next=pb;
p=pb;
pb=pb->Next;
}
else
{p->Next=pa;
p=pa;
pa=pa->Next;
}
}
p->Next = pa ? pa : pb;
L1->Next=NULL;
L2->Next=NULL;
return L;
}
8.链表的逆置
这里用三指针法实现
linklist reverselist(linklist head)
{
Node *p,*q,*r;
q=head->next;
p=NULL;
r=NULL;
while(q)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head -> next = p;
return p;
}