满意答案
gtp1
2014.02.17
采纳率:47% 等级:12
已帮助:6464人
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include
typedef struct _list{
int value;
_list *next;
}list;
void init(list **p,int *length){
*p = (list *)malloc(sizeof(list));
(*p)->value = NULL;
(*p)->next = NULL;
*length = 0;
}
void add(int x,int value,list **p,int *length){
if(!*length){ //如果链表为空
(*p)->value = value;
(*p)->next = NULL;
}
else if(x == 1){ //如果要插入元素到第一个位置
list *q = (list *)malloc(sizeof(list));
q->value = value;
q->next = *p;
*p = q;
}
else{
list *iterator = *p;
list *q = (list *)malloc(sizeof(list));
q->value = value;
if(x >= *length + 1 ) //如果要插入到链表尾部
{
for( ; iterator->next != NULL;){
iterator = iterator->next;
}
iterator->next = q;
q->next = NULL;
}
else{
int i;
for(i = 1; i < x - 1; i ++){ //如果要插入到链表中部
iterator = iterator->next;
}
list *tmp = iterator->next;
iterator->next = q;
q->next = tmp;
}
}
(*length) ++;
}
void del(int x,list **p,int *length){
list *q = *p;
list *iterator = *p;
if(*length == 1){ //如果链表只有一个元素
free(*p);
*p = NULL;
}
else if(x == 1){ //如果要删除第一个元素
q = q->next;
free(*p);
*p = q;
}
else{
x = x > (*length) ? *length : x; //如果要删除剩余元素
for(; x > 2; x--){
iterator = iterator->next;
}
q = iterator->next;
if(q->next == NULL){
free(q);
iterator->next = NULL;
}else{
iterator->next = q->next;
free(q);
}
}
(*length) -- ;
}
void print(int x,list *p,int *length){
if(!(*length)){
printf("empty\n");
}
else{
x = x > *length ? *length : x;
for(; x > 1; x--,p = p->next){
}
printf("%d ",p->value);
}
}
int main(){
list *p; //链表头
int length; //链表长度
int n;
char input[255];
scanf("%d",&n);
while(n--){
fflush(stdin); //刷新输入缓冲区
gets(input); //getline
if(strncmp(input,"INIT",strlen("INIT")) == 0){
init(&p,&length);
}
else if(strncmp(input,"ADD",strlen("ADD")) == 0){
int x,value;
sscanf(input,"%*s%d%d", &x, &value);
add(x,value,&p,&length);
}
else if (strncmp(input,"LENGTH",strlen("LENGTH")) == 0){
printf("%d\n",length);
}
else if (strncmp(input,"PRINT",strlen("PRINT")) == 0){
int i = 1;
for(i; i <= length; i++)
print(i,p,&length);
printf("\n");
}
else if (strncmp(input,"DELETE",strlen("DELETE")) == 0){
int x,value;
sscanf(input,"%*s%d", &x);
del(x,&p,&length);
}
}
}
01分享举报