数据结构:C语言线性链式表(链表)的操作集
#include<stdio.h>
#include<stdlib.h>
#define ElementType int
#define TEST 222
typedef struct ListNode
{
ElementType data;
struct ListNode *next;
}LNode;
int GetLength(LNode *p);
LNode* Findnode_by_index(LNode *p,int index);
LNode* Findnode_by_value(LNode *p,ElementType datax);
LNode* Insert(LNode *p,ElementType newdata,int i);
LNode* Delete_by_index(LNode *p,int index);
LNode* Delete_by_value(LNode *p,ElementType X);
void Showlist(LNode *p);
int GetLength(LNode *p)
{
LNode *temp = p;
int length=0;
while (temp)
{
temp = temp->next;
length++;
}
return length;
}
LNode* Findnode_by_index(LNode *p,int index)
{
LNode *temp = p;
int i=1;
while(i<index&&temp!=NULL)
{
temp=temp->next;
i++;
}
if(i==index) return temp;
else {
printf("您输入的索引有误");
return NULL;
}
}
LNode* Findnode_by_value(LNode *p,ElementType datax)
{
LNode *temp = p;
while(temp!=NULL)
{
if (datax == temp->data) return temp;
else temp=temp->next;
}
return NULL;
}
LNode* Insert(LNode *p,ElementType newdata,int i)
{
LNode *temp,*s;
if (i==1)
{
temp = (LNode*)malloc(sizeof(LNode));
temp->data=newdata;
temp->next=p;
return temp;
}
s=Findnode_by_index(p,i-1);
if (s==NULL){
printf("索引错误,无法插入元素");
return p;
}
else{
temp = (LNode*)malloc(sizeof(LNode));
temp->data=newdata;
temp->next=s->next;
s->next=temp;
return p;
}
}
LNode* Delete_by_index(LNode *p,int index)
{
LNode *temp=p;
int i;
if(index<1 || index>GetLength(p))
{
printf("该链表不存在此位置,删除失败");
return p;
}
if (index==1) return p->next;
else {
for (i=0;i<index-2;i++) temp=temp->next;
temp->next=temp->next->next;
return p;
}
}
LNode* Delete_by_value(LNode *p,ElementType X)
{
if (p->data==X) return p->next;
LNode *temp=p;
int i;
while(temp)
{
if(temp->next->data==X)
{
temp->next=temp->next->next;
return p;
}
temp=temp->next;
}
printf("can not find X");
return NULL;
}
void Showlist(LNode *p)
{
LNode *temp=p;
while (temp!=NULL)
{
printf("%d \n",temp->data);
temp=temp->next;
}
}
int main()
{
LNode *list=NULL;
printf("------------------------插入操作测试------------------------\n");
int a[10]={1,2,45,46,87,34,54,65,43,55};
int i;
for(i=0;i<10;i++)
{
list=Insert(list,a[i],1);
}
list=Insert(list,TEST,8);
Showlist(list);
printf("\n------------------------查找操作测试------------------------\n");
printf("第五个元素为%d \n",Findnode_by_index(list,5)->data) ;
printf("\n------------------------删除操作测试------------------------\n");
list=Delete_by_index(list,3);
list=Delete_by_value(list,1);
printf("删除后的list为\n");Showlist(list);
printf("\n------------------------计算长度测试------------------------\n");
printf("链表长度为 %d ",GetLength(list));
}