本来你的问题我是不会回答的,因为你问的是数据结构中最基础的一种结构:线性表。随便找什么书都有相关讲解。但是既然你专门发短信息给我。我就简单回复下。
首先一个,线性表根据存储方式基本分两种,一种是顺序存储结构,即数组的方式,随机访问方便,插入,搜索都是线性时间(对于无序数据),缺点是不适合动态存取,插入删除时还需要移动其他元素。另一种是链表,链表根据其遍历方向,有可以分为单向链接表和双向链接表,链表的优点是插入删除节点比较方便,适合动态存取,缺点是指针要占用额外空间,随机访问不方便。
从你的题目也没说要求哪一种。我就默认按你的题目指的是单向链表。
以下代码尚未经过调试和测试和检验,不敢保证正确。
(0)先定义节点的数据结构:
typedef struct node
{
int data;
struct node *next; //指向下一个节点的指针
} NODE;
(1)建立链表需要一个头指针
NODE *head=NULL;
节点都是动态分配内存的,所以也不需要什么额外操作,一个空链表,其head=NULL;这里创建链表是指用户录入数据的过程:返回表头指针:
NODE* initial_List()
{
NODE *head,p;
int n,i=0;
char c;
head=NULL;
printf("input datas:\n");
while(scanf("%d",&n)>0)
{
List_insert(&head,i++,n);
}
do{scanf("%c",&c);}while(c!='\n');
return head;
}
(2)求元素个数:需要遍历一下链表
int List_length(NODE *head)
{
NODE *p=head;
int length=0;
while(p)
{
p=p->next;
length++;
}
return length;
}
(3)按序号取元素 get_element(L,i)——取出表中序号为i的元素 。
NODE* get_element(NODE *head,int i)
{
NODE *p=head;
int t=0;
if(i<0)
return NULL;
while(p && t++<i)
{
p=p->next;
}
return p;
}
(4)按值查询 List_locate(L,x)——取出指定值为x的元素,若存在该元素,则返回其地址;否则,返回一个能指示其不存在的地址值或标记。
NODE* List_locate(NODE *head,int x)
{
NODE *p=head;
while(p)
{
if(p->data == x) /* 是否已经找到了节点,找到了则返回节点指针 */
return p;
p=p->next;
}
return NULL;
}
(5)插入元素 List_insert(L,i,x)——在表L的第i个位置上插入值为x的元素。显然,若表中的元素个数为n,则插入序号i应满足1<=i<=n+1。
*********注意,这里一律使用0为base的索引值。和你的题目要求都是1为base有不同!.***********
注意,这个操作和前面不同的是,它可能影响表头的地址,所以我们需要传入的是表头指针head的指针,这样我们才能在函数中修改表头地址。
返回值表示该节点成为表中第几个节点,返回1表示插入头部,返回0表示失败。
int List_insert(NODE **head,int i,int x)
{
NODE *p, *u=(NODE*)malloc(sizeof(NODE));
u->data=x;
if(i<0)
return 0;
if(i==0)
/*在表头插入节点*/
{
u->next=*head;
*head=u;
/*更新头指针*/
return 1;
}
else
{
p=get_element(*head,i-1);
/* 取到i-1节点,插到i-1节点后面*/
if(p)
{
u->next=p->next;
p->next=u;
return i+1;
}
else
{
free(u);
return 0;
/*插入失败*/
}
}
}
(6)删除元素 List_delete(L,i)——删除表L中序号为i的元素,显然,待删除元素的序号应满足1<=i<=n。(注意改为索引0~n-1,因为看这种表示法不爽!)
注意这里可能删除表头,所以还是要传表头指针的指针。
int List_delete(NODE **head,int i)
{
NODE *p,*q=*head;
if(i<0 || q==NULL)
/*链表如果已经是空的,则返回失败*/
return 0;
if(i==0) /*删除表头*/
{
*head=q->next;
free(q);
/*删除表头*/
return 1;
}
else
{
p=get_element(*head,i-1);
if(!p)
return 0;
/*删除失败,返回0*/
else
{
q=p->next;
if(!p)
return 0;
/*删除失败*/
else
{
p->next = q->next;
free(q);
/*释放相应节点*/
return 1;
/*删除成功*/
}
}
}
}