简述
概念定义
相关操作
InitList(*L): 初始化操作,建立一个空的线性表L。
GetElem(L,i,*e): 将线性表L中的第i个位置元素值返回给e。
LocateElem(L,e): 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。
ListInsert(*L,i,e): 在线性表L中第i个位置插入新元素e。
ListDelete(*L,i,*e): 删除线性表L中第i个位置元素,并用e返回其值。
代码实现
定义类型
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *next;
}Lnode,*LinkList;
具体操作
初始化
头插法
/*头插法初始化链表*/
LinkList InitList(int n)
{
int i;
LinkList head, node;//定义头节点,普通节点;
head = (LinkList)malloc(sizeof(Londe));//分配地址
head->next = NULL;
for (i = 0; i < n; i++) {
node = (LinkList*)malloc(sizeof(Lnode));
printf("请输入第%d个结点",i+1);
scanf("%d",&node->data);
node->next = head->next;
head->next = node;
}
return head;
}
尾插法
/*尾插法初始化链表*/
LinkList InitList(int n)
{
int i;
LinkList head, node, end;//定义头节点,普通节点,尾部节点;
head = (LinkList)malloc(sizeof(Londe));//分配地址
end = head; //若是空链表则头尾节点一样
for (i = 0; i < n; i++) {
node = (Lnode*)malloc(sizeof(Lnode));
printf("请输入第%d个结点",i+1);
scanf("%d",&node->data);
end->next = node;
end = node;
}
end->next = NULL;//结束创建
return head;
}
插入
/*插入第i个,从1开始数*/
int ListInsert(LinkList L,int i,ElemType e)
{
int index;
Lnode *t = (Lnode*)malloc(sizeof(Lnode));
if(i > 0)
{
Lnode * p = L;
for(index=0;index<i && (p!=NULL);index++)
{
p = p->next;
}
if(p!=NULL)
{
t->data = e;
t->next = p->next;
p->next = t;
return 0;
}
}
printf("超出界限");
return -1;
}
查找
根据索引查找
/*获取链表第i个*/
ElemType GetElem(LinkList L,int i)
{
int index;
Lnode *p = L;
if(i >= 0)
{
for(index=0;index <= i && (p!=NULL);index++)
{
p = p->next;
}
}
if(p==NULL)
{
printf("索引越界");
exit(1);
}
else
return p->data;
}
根据值查找
/*获取链表中某元素所在的位置,只取第一次出现的*/
int LocateElem(LinkList L,ElemType e)
{
int index = 0;
while(L->next!=NULL)
{
L = L->next;
if(L->data==*e)
{
return index;
}
index ++;
}
return index;
}
删除
/*删除结点*/
void ListDelete(LinkList L,int n)
{
Lnode *t,*p = L;
int i = 0;
while (i <= n && p != NULL) {
t = p;
p = p->next;
i++;
}
if (p != NULL) {
t->next = p->next;
free(p);
p = NULL;
}
else {
printf("节点不存在");
}
}