首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

单链表第i个元素头里插入元素

2013-07-01 
单链表第i个元素之前插入元素#define TRUE 1#define FALSE 0typedef int Statustypedef struct student{c

单链表第i个元素之前插入元素

#define TRUE 1
#define FALSE 0
typedef int Status;
typedef struct student{
    char number[11];
    char name[11];
    char sex;        /*  M F or N*/
    int age;
    char tel[15];
    char addr[50];
    float math;         /*五门课成绩*/
    float english;
    float chemistry;     
    float physics;
    float history;
    float average;  /*平均分*/
}Item;

typedef struct node{
    Item item;
    struct node *next;   
}Node;

typedef  Node * List;


/*向第i个元素前插入一条数据*/ 
Status Insert(List * plist,int i,Item item){
    Node * pnode = *plist;
    Node * pnew;
    int j=1;
    
    if(i<1||i>ListItemCount(plist))
        return FALSE;
    else if(i==1){
        CopyToNode(item,pnew);
        pnew->next = pnode;
        *plist = pnew; 
        return TRUE;
    }
    
    while(pnode!=NULL&&j<(i-1)){
         pnode = pnode->next;
         j++;                         
    }
    if(!pnode||j>i)
        return FALSE;
    CopyToNode(item,pnew);
    pnew->next = pnode->next;
    pnode->next = pnew;     
    return TRUE;       
} /*上面这段代码有问题,不知出在哪里?大神们路过帮小弟看一下,感激不尽*/


/*局部函数定义*/ 
static void CopyToNode(Item item,Node *pnode){
    pnode->item = item;       
}

[解决办法]
参考一下下面的代码:在第pos个节点的前面插入一个新的结点,该节点的值是val, 并且pos的值是从1开始

bool insert_list(PNODE pHead, int pos, int val)
{
int i = 0;
PNODE p = pHead;

while (NULL!=p && i<pos-1)
{
p = p->pNext;


++i;
}

if (i>pos-1 
[解决办法]
 NULL==p)
return false;

//如果程序能执行到这一行说明p已经指向了第pos-1个结点,但第pos-1个节点是否存在无所谓
//分配新的结点
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("动态分配内存失败!\n");
exit(-1);
}
pNew->data = val;

//将新的结点存入p节点的后面
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;

return true;
}

[解决办法]
大概修改了一下,请参考.


/*向第i个元素前插入一条数据*/ 
Status Insert(List * plist,int i,Item item){
    Node * pnode = plist;
    Node * pnew;
    int j=1;
    
    if(i<1 
[解决办法]
 i>ListItemCount(plist)) {
        return FALSE;
    } else {                                 // i >= 1 && i <= ListItemCount
        pnew = (NODE *)malloc(sizeof(NODE)); // malloc memory
        pnew->item = item; 
        if(i == 1){ //insert before the head
            pnew->next = pnode;
            plist = pnew; 
            return TRUE;
        } else { //insert 
            while(j != i-1){
                pnode = pnode->next;
                j++;                         
            }
            pnew->next = pnode->next;
            pnode->next = pnew;     
            return TRUE;       
        }
    }

热点排行