//copyright vinco zhang
//linklist with head node
#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
/*******************type define**********************/
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node* next;
}LNode,* LinkList;
/*****************function declaration************************/
LinkList Create_LinkList_H(int n);// insert into head
LinkList Create_LinkList_R(int n);// insert into Tail
int Length_LinkList(LinkList L);
LinkList Init_LinkList();
LinkList Locate_LinkList_i(LinkList L, int i);
LinkList Locate_linkList_x(LinkList L, ElemType x);
void Reverse_LinkList(LinkList L);
void InsertAfter(LinkList p, int x);
void InsertBefore(LinkList L, LinkList p, int x);
void DeleteNode(LinkList L, LinkList p);
void Delete_LinkList_i(LinkList L, int i);
void Delete_LinkList_x(LinkList L, int x);
/*****************************************/
int main()
{
printf("linklist/n");
return 0;
}
/*****************************************/
LinkList Create_LinkList_H(int n) {
// 逆位序输入(随机产生)n个元素的值,建立带表头结点的单链线性表L
LinkList L,p;
int i;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL; // 先建立一个带头结点的单链表
for (i=n; i>0; --i)
{
p = (LinkList)malloc(sizeof(LNode)); // 生成新结点
scanf("%d", p->data);
p->next = L->next;
L->next = p; // 插入到表头
}
return L;
}
LinkList Create_LinkList_T(int n)
{
LinkList L,p,q;
int i;
L=(LinkList)malloc(sizeof(LNode));
p=L;
for(i=1;i<=n;i++)
{
q = (LinkList)malloc(sizeof(LNode));
scanf("%d",q->data);
p->next = q;
p = q;
}
p->next = NULL;
return L;
}
LinkList Init_LinkList()
{
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next =NULL;
return L;
}
int Length_LinkList(LinkList L)
{
LinkList p;
int j=0;
p=L->next ;
while(p)
{
j++;
p=p->next;
}
return j;
}
LinkList Locate_LinkList_i(LinkList L, int i)
{
LinkList p=L;
int j=0;
while(j<i && p->next !=NULL)
{
p=p->next;
j++;
}
if(j==i) return p;
else
return NULL;
}
LinkList Locate_linkList_x(LinkList L, ElemType x)
{
LinkList p=L->next ;
while(p!=NULL && p->data!=x)
p=p->next;
return p;
}
void Reverse_LinkList(LinkList L)
{
LinkList p,q,s;
if(!L->next || !L->next->next ) return;
q=L->next->next ;
L->next->next=NULL;
while(q)
{
s=q->next;
q->next=L->next ;
L->next=q;
q=s;
}
}
void InsertAfter(LinkList p, int x)
{
LinkList s;
s=(LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = p->next;
p->next = s;
}
void InsertBefore(LinkList L, LinkList p, int x)
{
LinkList q,s;
s=(LinkList)malloc(sizeof(LNode));
s->data = x;
q = L;
while(q->next!=p) q=q->next;
s->next = q->next;
q->next = s;
}
int DeleteAfter(LinkList p)
{
LinkList r;
if(p->next!=NULL)
{
r = p->next;
p->next = r->next;
free(r);
return 1;//success
}
return 0;// fail
}
void DeleteNode(LinkList L, LinkList p)
{
LinkList q;
q=L;
while(q->next!=p) q = q->next;
q->next = p->next;
free(p);
}
void Delete_LinkList_i(LinkList L, int i)
{
LinkList q,p;
q = Locate_List(L,i-1);
if(q==NULL)
{
printf("position i-1 is not exist!/n");
return;
}
else
{
if(q->next == NULL) printf("position i is not exist!/n");
else
{
p = q->next;
q->next = p->next;
free(p);
}
}
}
void Delete_LinkList_x(LinkList L, int x)
{
LinkList q,p;
int count=0;
q=L;
while(q->next)
{
p=q->next;
if(p->data==x)
{
q->next=p->next;
free(p);
count++;
}
else q=p;
}
return count;
}
参考资料:
《数据结构(C语言版)》
本文介绍使用C语言实现单链表的各种基本操作,包括创建、插入、删除节点等,并提供完整的源代码示例。
6242

被折叠的 条评论
为什么被折叠?



