读书人

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

发布时间: 2013-07-01 12:33:04 作者: rapoo

单链表第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;
}
}
}

读书人网 >C语言

热点推荐