链表是用一组任意的存储单元来存放线性表的结点.
为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址信息,这个信息称为指针或链
下面是C语言实现链表的数据结构及基本的算法。
- # include <stdio.h>
-
# include <stdlib.h>
-
typedef char DataType; //定义节点数据域类型
-
typedef struct node //节点类型定义
-
{
-
DataType data; //节点的数据域
-
struct node *next; //节点的指针域指向下一个节点
-
}ListNode;
-
typedef ListNode *LinkList;
-
ListNode *p; //定义节点指针
-
LinkList head; //定义链表头指针
-
-
-
/*错误信息输出函数*/
-
void Error(char *message)
-
{
-
fprintf(stderr,"Error:%s/n",message); //输出错误信息
-
exit(1);//终止程序,返回1给操作系统
-
}
-
-
/*打印输出链表*/
-
void printList(LinkList head)
-
{
-
ListNode *p; //节点
-
int i=0;
-
if(head!=NULL)
-
{
-
p=head;
-
while(p->next!=NULL)
-
{
-
p=p->next;
-
printf("node[%d]=%c/n",i,p->data);
-
i++;
-
}
-
-
}
-
}
-
-
/*创建链表*/
-
LinkList CreateList()
-
{
-
char ch;
-
LinkList head=(LinkList)malloc(sizeof(ListNode));//生成头节点
-
ListNode *s,*r;
-
r=head;
-
head->data=''*'';
-
while((ch=getchar())!=''/n'')
-
{
-
s=(LinkList)malloc(sizeof(ListNode));
-
s->data=ch;
-
r->next=s;
-
r=s;
-
}
-
r->next=NULL;
-
return head;
-
}
-
-
/*取得第i个结点*/
-
ListNode * getNode(LinkList head,int i)
-
{
-
int j=0;
-
ListNode *p;
-
p=head;
-
while(p->next!=NULL)
-
{
-
p=p->next;
-
j++;
-
if(j==i)
-
{
-
return p;
-
}
-
}
-
return NULL;
-
}
-
-
/*根据结点值域找到结点*/
-
ListNode * getNodeByKey(LinkList head,DataType key)
-
{
-
int j=0;
-
ListNode *p;
-
char nodeData;
-
p=head;
-
while(p->next!=NULL)
-
{
-
p=p->next;
-
nodeData=p->data;
-
if(key==nodeData)
-
{
-
return p;
-
}
-
}
-
return NULL;
-
}
-
/*插入结点*/
-
void insertList(LinkList head,DataType x,int i)
-
{
-
ListNode *p,*s;
-
p=getNode(head,i-1);
-
if(p==NULL)
-
{
-
Error("position error");
-
}
-
s=(ListNode *)malloc(sizeof(ListNode));
-
s->data=x;
-
s->next=p->next;
-
p->next=s;
-
}
-
-
/*删除结点*/
-
void deleteList(LinkList head,int i)
-
{
-
ListNode *p,*r;
-
p=getNode(head,i-1);
-
if(p==NULL||p->next==NULL)
-
{
-
Error("position error");
-
}
-
r=p->next;
-
p->next=r->next;
-
free(r);
-
}
-
-
void main()
-
{
-
LinkList list;
-
ListNode *node;
-
int getIndex=4;
-
list=CreateList(); //创建链表
-
printList(list);
-
node=getNode(list,getIndex); //取得链表中索引为4的节点
-
printf("get node%d is%c/n",getIndex,node->data);
-
printf("insert X to node %d/n",3);
-
insertList(list,''X'',3); //在索引为3的地方插入节点
-
printList(list);
-
printf("delete %d node/n",3);
-
deleteList(list,3); //删除索引为3的节点
-
printList(list);
-
}
阅读(1325) | 评论(0) | 转发(0) |